numpy
numpy
为什么数学中的向量要用两个[]括起来如
[[1 2 3]]还有维度为
(3,)的矩阵重点在于抛弃数学上的长宽的两个维度的概念,这里可以有无穷个维度,维度内的数字也没有什么长宽、水平竖直的概念。
这里用np.sum()和np.argmin()进行试验
矩阵的轴(axis):矩阵的轴与维度对应,维度的第一个元素代表的轴是axis=0,第二个元素代表的轴是axis=1.如维度为(2,3,4)的矩阵axis=0即为2代表的维;再如数学中的2×3矩阵(即维度为(2,3))axis=0即为列(列方向),axis=1即为行(行方向)。
对axis进行指定轴操作会使矩阵降维,使用keepdims=True会使消失的轴保留,并保持维度为1。
array本身并不是一个类,只是为了创建一个ndarray。
sum(a, axis=None, dtype=None, out=None, keepdims=np._NoValue)
>>> c = np.arange(4)
>>> type(c)
<type 'numpy.ndarray'>
>>> c.shape
(4,)
>>> c[0]
0
>>> type(c[0])
<type 'numpy.int64'>
>>> d = np.random.randint(24,size=[2,3,4])
array([[[ 6, 12, 18, 4],
[15, 8, 6, 5],
[ 0, 15, 16, 3]],
[[15, 16, 2, 11],
[20, 3, 13, 19],
[11, 23, 21, 7]]])
>>> d.sum(axis=0).shape
(3, 4)
>>> d.sum(axis=1).shape
(2, 4)
>>> d.sum(axis=2).shape
(2, 3)
>>> d.sum(axis=0,keepdims=True).shape
(1, 3, 4)
>>> d.sum(axis=1,keepdims=True).shape
(2, 1, 4)
>>> d.sum(axis=2,keepdims=True).shape
(2, 3, 1)
>>> d.sum(axis=0,keepdims=True)
array([[[21, 28, 20, 15],
[35, 11, 19, 24],
[11, 38, 37, 10]]])
>>> d.sum(axis=1,keepdims=True)
array([[[21, 35, 40, 12]],
[[46, 42, 36, 37]]])
>>> d.sum(axis=2,keepdims=True)
array([[[40],
[34],
[34]],
[[44],
[55],
[62]]])np.argmin(a,axis=None,out=None)
找到输入数组a的anis轴上最小值的索引。也可以加深对于axis的理解。
默认输入axis为None,结果是将向量展开为一维向量的坐标。
array的参数
.ndim:维度
.shape:各维度的尺寸(2,5)
.size:元素的个数
.dtype:元素的类型,比如图片像素的类型是
uint8
array数组创建
np.ones((shape),dtype=np.uint8)
np.zeros((shape),dtype=np.uint8)
np.full((shape),val)
np.eye(n) 单位矩阵
np.arange([start=0,]stop,[step=1,]dtype=None) 产生数组[start,stop)
np.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)
创建数组:
np.empty(shaoe,dtype=float,order='C') dtype表示数据类型,order有C和F两个选项,行优先和列优先,在计算机内存中存储元素的顺序
np.zeros(shape,dtype,order)
np.ones(shape,dtype,order)
创建随即数组np.random
np.random.randn(d0,d1,d2……dn) d0,d1这些是shape。 返回一个或者一组服从标准正态分布的随机样本值。
np.random.rand(d0,d1,d2……dn) 使用方法与np.random.randn()函数相同。 通过本函数可以返回一个或一组服从“0~1”均匀分布的随机样本值。随机样本取值范围是[0,1),不包括1。
numpy.random.randint(low, high=None, size=None, dtype=’l’)
random.random()返回随机生成的一个实数,它在[0,1)范围内。 输入: low—–为最小值 high—-为最大值 size—–为数组维度大小 dtype—为数据类型,默认的数据类型是np.int。返回随机整数或整型数组,范围区间为[low,high),包含low,不包含high; high没有填写时,默认生成随机数的范围是[0,low)
数组维度变换
np.reshape(shape) 需要注意的是reshape并不会保存到原图像
np.resize(shape)
矩阵合并
np.concatenate([arr1, arr2],1)是说水平方向进行拼接,如果不填1就默认是垂直方向拼接
矩阵保存
数组以二进制格式保存 np.save和np.load是读写磁盘数组数据的两个主要函数。默认情况下,数组以未压缩的原始二进制格式保存在扩展名为npy的文件中,以数组a为例
np.save("filename.npy",a) b = np.load("filename.npy")
矩阵打乱
np.random.shuffle(arr) 多维矩阵中,只对第一维(行)做打乱顺序操作
数组切片
arr[-1]
arr[:3]
arr[:,0]
arr[1:3]
arr[:,:,1]
常用函数
np.exp() 参数是array,不能用math.exp(),这里的参数只能是一维的。
np.sum()
np.random.rand(d0,d1,…,dn)产生给定形状的随机数,随机数服从连续均匀分布分布,[0,1)
numpy.random.randn(d0,d1,…,dn)randn函数返回一个或一组样本,具有标准正态分布。
np.random.randint(low,high=None,size=None,dtype=‘I’)返回[low,high)之间的随机整数,服从离散均匀分布,如果没有输入high的话,返回[0,low)之间的随机整数。dtype:可取int或int64等
矩阵转置T
T点乘和矩阵乘法
和MATLAB不同,* 是元素逐个相乘,而不是矩阵乘法。在Numpy中使用dot来进行矩阵乘法:
广播Boardcasting
广播是一种强有力的机制,它让Numpy可以让不同大小的矩阵在一起进行数学计算。我们常常会有一个小的矩阵和一个大的矩阵,然后我们会需要用小的矩阵对大的矩阵做一些计算。
这样是行得通的,但是当x矩阵非常大,利用循环来计算就会变得很慢很慢。我们可以换一种思路:
Numpy广播机制可以让我们不用创建vv,就能直接运算,看看下面例子:
对两个数组使用广播机制要遵守下列规则:
如果数组的秩不同,使用1来将秩较小的数组进行扩展,直到两个数组的尺寸的长度都一样。
如果两个数组在某个维度上的长度是一样的,或者其中一个数组在该维度上长度为1,那么我们就说这两个数组在该维度上是相容的。
如果两个数组在所有维度上都是相容的,他们就能使用广播。
如果两个输入数组的尺寸不同,那么注意其中较大的那个尺寸。因为广播之后,两个数组的尺寸将和那个较大的尺寸一样。
在任何一个维度上,如果一个数组的长度为1,另一个数组长度大于1,那么在该维度上,就好像是对第一个数组进行了复制。
Last updated
Was this helpful?