文章目录
- 前言
- 环境
- 矩阵创建(单位阵、全零、全1矩阵等)
- 单矩阵操作(转置、三角阵、找索引、累计和、均值方差、各种范数等)
- 多矩阵操作(加减、乘法、数乘、点积、哈达马乘积等)
- 存储与加载
-
- `.txt .csv` 格式
- `.npy` 格式
- `.npz` 格式
前言
本文总结了在使用 Numpy 时的一些常用操作,包括矩阵的创建、单矩阵操作、多矩阵操作,以及矩阵的存储和加载。
在以下示例代码中,均已事前导入Numpy:
import numpy as np
环境
- Windows 10
- Python 3.7.0
- Numpy 1.18.1
矩阵创建(单位阵、全零、全1矩阵等)
- 单位阵:
np.eye(N, M=None)
指矩阵行数,默认N
,返回M=N
的单位阵,主对角线为1。shape=(N, M)
>>> np.eye(2, dtype=int) array([[1, 0], [0, 1]]) >>> np.eye(3, k=1) array([[0., 1., 0.], [0., 0., 1.], [0., 0., 0.]])
- 全零矩阵:
np.zeros(shape)
控制生成shape=(n, m)
行、n
列的矩阵。m
>>> s = (2,2) >>> np.zeros(s) array([[ 0., 0.], [ 0., 0.]])
- 全1矩阵:
np.ones(shape)
>>> np.ones(5) array([1., 1., 1., 1., 1.]) >>> s = (2,2) >>> np.ones(s) array([[1., 1.], [1., 1.]])
- 转换生成:
np.array(p_object)
可以指p_object
和list
等形状上类似于tube
的对象。array
>>> np.array([[1, 2], [3, 4]]) array([[1, 2], [3, 4]]) >>> np.array(np.mat('1 2; 3 4')) array([[1, 2], [3, 4]]) >>> (np.arange(0, 4) - 2).reshape(2, 2) array([[-2 -1] [ 0 1]])
单矩阵操作(转置、三角阵、找索引、累计和、均值方差、各种范数等)
- 转置:
或arr.T
arr.transpose()
- 求上/下三角矩阵:
/arr = np.triu(arr, k=0)
其中,arr = np.tril(arr, k=0)
(默认) 表明保留主对角线的元素,k=0
表示保留主对角线之上的全部,k>0
表示保留主对角线之下的全部。k<0
np.tril([[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15]], -1) array([[ 0, 0, 0], [ 4, 0, 0], [ 7, 8, 0], [10, 11, 12], [13, 14, 15]])
- 找到特定值的索引:
index = np.where(arr == target)
时就是找到全部为1元素的索引。target=1
- 求累计和:
其中,默认是全部元素的累计和,np.cumsum(arr, axis=None)
表示按列统计,axis=0
axis=1
表示按行统计。
在绘制 CDF 前的准备工作中,可用来做离散值的统计。
>>> a = np.array([[1,2,3], [4,5,6]]) >>> a array([[1, 2, 3], [4, 5, 6]]) >>> np.cumsum(a) array([ 1, 3, 6, 10, 15, 21]) >>> np.cumsum(a,axis=0) # sum over rows for each of the 3 columns array([[1, 2, 3], [5, 7, 9]]) >>> np.cumsum(a,axis=1) # sum over columns for each of the 2 rows array([[ 1, 3, 6], [ 4, 9, 15]])
- 均值方差:
,np.mean(arr)
默认是全部元素,也可以指定按行或按列,详见函数方法介绍。np.var(arr)
- 带有
值的均值和方差:np.nan
,np.nanmean(arr)
不指定维度的话默认是全部非np.nanvar(arr)
值的均值和方差。np.nan
还支持很多其他统计值的函数。【注】该方法可以很有效地用来在做统计时,屏蔽某些特定值的干扰。例如:可以将矩阵中的全部np.nan...
的元素转换为<0
,然后再统计就可屏蔽原矩阵中负数元素的影响。np.nan
>>> a = np.array([[1, np.nan], [3, 4]]) >>> np.nanmean(a) 2.6666666666666665 >>> np.nanvar(a) 1.5555555555555554
- 各种范数的计算 【说明文档】常见范数的数学定义与 Numpy 实现
多矩阵操作(加减、乘法、数乘、点积、哈达马乘积等)
- 加减:同
的两个矩阵shape
和A
, 两者的和为B
, 差为A + B
A - B
- 乘法:主要有
,np.matmul()
,np.multiply()
这三个函数,具体的区别和使用方法,可移步 【说明文档】详解 Numpy 中的各种”乘法“操作 。此处只将常见的操作总结如下:np.dot()
x1 | x2 | 数学操作 | 函数选择 | 示例 |
---|---|---|---|---|
scalar | scalar | 两数相乘 | np.dot() 或 * | --> 21 --> 21 |
scalar | 1-D array | 向量数乘 | np.dot() 或 np.multiply() | --> [ 3 12] --> [ 3 12] |
scalar | 2-D array | 矩阵数乘 | np.dot() 或 np.multiply() | --> [[0 3], [6 9]] --> 同上 |
1-D array | 1-D array | 点积 (内积、数量积) | np.dot() 或 np.matmul() | --> 29 --> 22 |
2-D array | 2-D array | 矩阵乘法 | np.dot() 或 np.matmul() | --> [[10 13]] --> [[10 13]] |
2-D array | 2-D array | 哈达马乘积 | np.multiply() | --> [[0 1 4]] --> [ 2 20 18] |
存储与加载
.txt .csv
格式
.txt .csv
- 存储 :
np.savetxt(fname="use_info.csv", X=sequence_array)
不需要提前打开,不需要提供文件fname
,若该文件已经存在,保存后会覆盖原文件。handle
- 加载:
use_info = np.loadtxt(fname="use_info.csv")
类型为use_info
, 和保存前的ndarray
类型、数值都一样。sequence_array
.npy
格式
.npy
注意,该保存操作会在保存文件的名字自动添加
.npy
的后缀。
>>> x = np.arange(10)
>>> np.save('file_out', x)
>>> np.load('file_out.npy')
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
.npz
格式
.npz
- 存储:将多个矩阵存放在一个文件当中,
,另外np.savez()
多一个压缩的操作,也是要注意会将文件名加np.savez_compressed()
的后缀;.npz
- 加载:
np.load()
>>> test_array = np.random.rand(3, 2)
>>> test_vector = np.random.rand(4)
>>> np.savez_compressed('/tmp/123', a=test_array, b=test_vector)
>>> loaded = np.load('/tmp/123.npz')
>>> print(np.array_equal(test_array, loaded['a']))
True
>>> print(np.array_equal(test_vector, loaded['b']))
True