文章目录
前言
本文总结了在使用 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
,返回shape=(N, M)
的单位阵,主对角线为1。>>> 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)
target=1
时就是找到全部为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()
,np.dot()
这三个函数,具体的区别和使用方法,可移步 【说明文档】详解 Numpy 中的各种”乘法“操作 。此处只将常见的操作总结如下:
x1 | x2 | 数学操作 | 函数选择 | 示例 |
---|---|---|---|---|
scalar | scalar | 两数相乘 | np.dot() 或 * | 3 * 7 --> 21 np.dot(3, 7) --> 21 |
scalar | 1-D array | 向量数乘 | np.dot() 或 np.multiply() | np.dot(3, [1, 4]) --> [ 3 12] np.multiply(3, [1, 4]) --> [ 3 12] |
scalar | 2-D array | 矩阵数乘 | np.dot() 或 np.multiply() | np.dot(3, np.arange(0, 4).reshape(2, 2)) --> [[0 3], [6 9]] np.multiply(3, np.arange(0, 4).reshape(2, 2)) --> 同上 |
1-D array | 1-D array | 点积 (内积、数量积) | np.dot() 或 np.matmul() | np.dot([2, 5, 7], [1, 4, 1]) --> 29 np.matmul([2, 5], [1, 4]) --> 22 |
2-D array | 2-D array | 矩阵乘法 | np.dot() 或 np.matmul() | x1 = np.arange(0, 3).reshape(1, 3) x2 = np.arange(0, 6).reshape(3, 2) np.dot(x1, x2) --> [[10 13]] np.matmul(x1, x2) --> [[10 13]] |
2-D array | 2-D array | 哈达马乘积 | np.multiply() | x3 = np.arange(0, 3).reshape(1, 3) x4 = np.arange(0, 3).reshape(1, 3) np.multiply(x3, x4) --> [[0 1 4]] np.multiply([2, 5, 6], [1, 4, 3]) --> [ 2 20 18] |
存储与加载
.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
的后缀。
>>> 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
格式
- 存储:将多个矩阵存放在一个文件当中,
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