先给出官方文档
Numpy(后面都用np指代)常常用于矩阵计算,其特点就是高效,下面介绍一些基本语法:
import numpy as np
>>>a = np.array([[1, 2, 3], [4, 5, 6]])
>>>print(a)
>>>print(a.ndim)
>>>print(a.shape)
>>>print(a.size)
([[1, 2, 3],
[4, 5, 6]])
2
(2,3)
6
第一个print出的是该矩阵,这里是一个2行3列的矩阵。
ndim为维度(number of dimension) 这里返回的是2
shape返回的(m, n) m行n列
size返回有多少个元素。
同时还有如下属性(不常用)
>>>print(a.dtype)
>>>print(a.itemsize)
>>>print(a.data)
dtype('int64')
8
<memory at 0x10f05cea0>
这里的ndarray的dtype默认为64位(8字节),这个我们可以自行更改,包括(int64,int32,int16,float64)等
这里的itemsize为64/8,(对于复数来说也一样),complex32 的itemsize返回为4(32/8)
创建矩阵:
np.zeros((m, n), dtype=int64) 创建dtype类型为int64的m(行)*n(列)的零矩阵
np.ones((m,n)) 创建m(行)*n(列) 元素全部为1的矩阵
np.empty((m,n)) 这里给出官方链接,官方解释为并没有将数组的值设置为0,所以速度更快,但是需要手动设定数组的值。
np.arange(m,n,s) 这里m为起始值,n为终值(不包括),s为步长生成一个等差数组
ndarray.reshape(m,n) 将ndarray变形为m行n列的数组
np.linspace(m,n,p) 这里m为起始值,n为终值, 返回p个均匀间隔的数字
np.random.random((m,n)) 生成m行n列的随机矩阵,值为0~1
矩阵算法:
>>>a = np.array([10, 20, 30, 40])
>>>b = np.arange(4)
a-b 矩阵减法
a+b 矩阵加法
a*b 矩阵点积
np.dot(a,b) 或 a.dot(b) 矩阵乘积
a *= m 将a中每个元素乘以m
a += m 将a中每个元素加上m (如果m的dtype为float,a为int,则会报错,反之不会)
对于每个数组a:
np.sum(a, axis=) 也可以写作a.sum()下面不再重复 对a进行求和,axis这里可以为0,1,None 0为按列求和,1为按行求和,None为所有元素求和
np.min(a,axis=None) 求最小值
np.max(a,axis=None) 求最大值
np.argmin(a,axis=None) 返回最小值在哪一位
np.argmax(a,axis=None) 返回最大值在哪一位
np.mean(a,axis=None) 返回均值 (也可以用np.average(a),但是不推荐。因为a没有average属性,但是有mean属性)
np.median(a,axis=None) 返回中位数
np.cumsum(a,axis=None) 当axis=None时返回一维数组,axis=0或1时 按列/行累加,依旧返回m*n的数组
np.diff(a,axis=None) 累差,这里给出例子:
>>>a = np.arange(1,13).reshape(3,4)
>>>print(np.diff(a))
[[1 1 1]
[1 1 1]
[1 1 1]]
>>>print(np.diff(a,axis=0))
[[4 4 4 4]
[4 4 4 4]]
>>>print(np.diff(a,axis=1))
[[1 1 1]
[1 1 1]
[1 1 1]]
np.nonzero(a) 返回两个数组,返回非0元素的行和列,第一个数组为行,第二个为列,这里也给出例子:
a = np.array([[2,5,0,8],[3,0,1,7],[0,9,11,0]])
print(a)
([[ 2, 5, 0, 8],
[ 3, 0, 1, 7],
[ 0, 9, 11, 0]])
np.nonzero(a)
(array([0, 0, 0, 1, 1, 1, 2, 2]), array([0, 1, 3, 0, 2, 3, 1, 2]))
返回的结果的含义为[0,0],[0,1],[0,3],[1,0],[1,2],[1,3],[2,1],[2,2]为非0元素。
np.sort(a,axis=1) 排序,axis默认为1
np.transpose(a) 矩阵转置,也可以用 a.T
np.clip(a,m,n) 对于a矩阵,小于m的元素的值设置为m,大于n的值设置为n
索引:
>>>a = np.arange(12).reshape(3,4)
>>>a[1,:] #输出特定行
array([4, 5, 6, 7])
>>>a[1,1] #输出特定元素
5
>>>for row in a:
>>> print(row)
[0 1 2 3]
[4 5 6 7]
[8 9 10 11]
>>>for column in a.T:
>>> print(column)
[0 4 8]
[1 5 9]
[ 2 6 10]
[ 3 7 11]
如果用for循环输出的时候,默认是按行输出的,如果我们想要按列输出,只需把原矩阵转置就可以了。
>>>for element in a.flat:
>>> print(element)
0
1
2
3
4
5
6
7
8
9
10
11
ndarray的flat的属性可用于迭代循环输出所有元素
ndarray.flatten()则会把所有元素作为一维数组输出
ndarray.ravel() 同上
数组合并/分割:
np.concatence((a, b, c, d), axis=None) 将数组a,b,c,d合并,默认按列合并
np.split(a, s, axis=1) 将数组a分割成s段, 这里要求必须是均分。
np.vstack((a, b)) 将a,b按列合并
np.vsplit(a, s) 将a按列分成s个数组
np.hstack((a, b)) 将a,b按行合并
np.hsplit(a, s) 将a按行分成s个数组
np.array_split(a, s, axis=0) 类似split,但是可以不等分
数据复制:
b = a 会让b和a完全相等(b is a) 如果对a或者b reshape同样会影响到另一个
>>>a = np.arange(12).reshape(3,4)
>>>b = a
>>>c = b
>>>c[1,1] = 0
>>>print(a)
[[ 0 1 2 3]
[ 4 0 6 7]
[ 8 9 10 11]]
b = a.view() 会让a,b共享数据 (更改b的数据则a的也会被更改),变形等则没有影响
>>>b =a.view().reshape(2,6)
>>>print(a)
[[ 0 1 2 3]
[ 4 0 6 7]
[ 8 9 10 11]]
>>>print(b)
[[ 0 1 2 3 4 0]
[ 6 7 8 9 10 11]]
b = a.copy() 会让b完全复制a的数据,更改任何数据对另一个则没有
>>>b = a.copy()
>>>b[0,0]=1
>>>print(a)
[[ 0 1 2 3]
[ 4 0 6 7]
[ 8 9 10 11]]
>>>print(b)
[[ 1 1 2 3]
[ 4 0 6 7]
[ 8 9 10 11]]
深拷贝:
b = a.copy()
这种形式会让b和a分配不同的内存地址: 既 a和b相互独立,更改其中一个的任何数据对另一个没有影响。
浅拷贝:
b = a.view()
b.base is a.base 会返回True 这时候a和b会共享其中的数据,但是对b或者a进行reshape等,则不会对另一个的结构造成影响。