【学习笔记】numpy

先给出官方文档

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等,则不会对另一个的结构造成影响。


猜你喜欢

转载自blog.csdn.net/Canon__/article/details/79634111