array数据基本属性
代码语言:javascript复制x = np.arange(15)
# array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
# 维度
x.ndim
# 1
# 总个数
x.size
# 15
# 查看维数
x.shape
# (15,)
array数据访问
代码语言:javascript复制x=np.arange(15).reshape(3,5)
x[0]
# array([0, 1, 2, 3, 4])
# 不建议用下面的方式访问
# x[0][-1]
# x[0][1]
#推荐使用这种方法
x[1,1]
# 6
切片操作
代码语言:javascript复制x=np.arange(15)
# array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
#获取前5个元素
x[:5]
# array([0, 1, 2, 3, 4])
#获取5后面的元素
x[5:]
# array([ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
#步长为2截取元素
x[::2]
# array([ 0, 2, 4, 6, 8, 10, 12, 14])
#步长为-1截取元素(倒序)
x[::-1]
# array([14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
universal functions
需要注意的是,Numpy的universal functions
计算都是针对每个元素的
L = np.arange(20).reshape(4,5)
#array([[ 0, 1, 2, 3, 4],
# [ 5, 6, 7, 8, 9],
# [10, 11, 12, 13, 14],
# [15, 16, 17, 18, 19]])
L-1
#array([[-1, 0, 1, 2, 3],
# [ 4, 5, 6, 7, 8],
# [ 9, 10, 11, 12, 13],
# [14, 15, 16, 17, 18]])
L*2
#array([[ 0, 2, 4, 6, 8],
# [10, 12, 14, 16, 18],
# [20, 22, 24, 26, 28],
# [30, 32, 34, 36, 38]])
#绝对值
np.abs(-1)
#三角函数
np.sin(1)
np.cos(1)
np.tan(1)
矩阵之间的计算
为了方便说明,首先定义两个矩阵A和B
代码语言:javascript复制A=np.arange(4).reshape(2,2)
B=np.arange(4).reshape(2,2)
A
#array([[0, 1],
# [2, 3]])
B
#array([[0, 1],
# [2, 3]])
以下进行加减乘除取余乘方等操作都是矩阵对应元素之间
进行对应的计算
A B
#array([[0, 2],
# [4, 6]])
A*B
#array([[0, 1],
# [4, 9]])
如果要进行矩阵乘法,需要使用dot
方法
# A和B矩阵乘法
A.dot(B)
#array([[ 2, 3],
# [ 6, 11]])
求转置矩阵
代码语言:javascript复制A.T
#array([[0, 2],
# [1, 3]])
向量和矩阵计算
代码语言:javascript复制v = np.array([1,2])
# array([1, 2])
A
#array([[0, 1],
# [2, 3]])
#和每一行做加法
v A
#array([[1, 3],
# [3, 5]])
#和每一行做减法
v-A
#array([[ 1, 1],
# [-1, -1]])
#向量乘以矩阵
v.dot(A)
array([4, 7])
A.dot(v)
# numpy会自动切换行、列向量使得计算可以进行
# 此处将v转化成2x1矩阵
求逆矩阵等相关操作
代码语言:javascript复制# 求A的逆矩阵,linalg是numpy下的一个线性代数包
np.linalg.inv(A)
#array([[-1.5, 0.5],
# [ 1. , 0. ]])
invA = np.linalg.inv(A)
A.dot(invA)
#array([[1., 0.],
# [0., 1.]])
# 矩阵乘以矩阵的逆等于单位矩阵,符合定义
在某些情况下,大部分矩阵没有逆,需要求伪逆矩阵
代码语言:javascript复制X = np.arange(16).reshape(2,8)
# invX = np.linalg.inv(X)
# 这个矩阵求不了逆矩阵,会报错
pinvX = np.linalg.pinv(X)
pinvX
#array([[-1.35416667e-01, 5.20833333e-02],
# [-1.01190476e-01, 4.16666667e-02],
# [-6.69642857e-02, 3.12500000e-02],
# [-3.27380952e-02, 2.08333333e-02],
# [ 1.48809524e-03, 1.04166667e-02],
# [ 3.57142857e-02, -7.30583920e-18],
# [ 6.99404762e-02, -1.04166667e-02],
# [ 1.04166667e-01, -2.08333333e-02]])
#查看伪逆矩阵的维数
pinvX.shape
#(8, 2)
X.dot(pinvX)
#array([[ 1.00000000e 00, -2.77555756e-16],
# [ 1.69309011e-15, 1.00000000e 00]])
聚合操作
Pythn内置sum()
函数和numpy.sum()
的对比
代码语言:javascript复制big_array = np.random.rand(10000000)
%timeit sum(big_array)
%timeit np.sum(big_array)
#755 ms ± 7.36 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
#11 ms ± 173 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
可以看到numpy.sum()的运行效率更佳,这是因为numpy对聚合运算做了优化
max、min
代码语言:javascript复制np.min(big_array)
#9.593480820857536e-08
np.max(big_array)
#0.9999999664721
矩阵中的聚合操作
代码语言:javascript复制X=np.arange(16).reshape(4,-1)
#array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11],
# [12, 13, 14, 15]])
np.sum(X)
# 120
np.max(X)
# 15
np.min(X)
# 0
# 求每一列的和
np.sum(X,axis=0)
# array([24, 28, 32, 36])
# 求每一行的和
np.sum(X,axis=1)
# array([ 6, 22, 38, 54])
# 乘积和
np.prod(X 1)
# 2004189184
# 中位数
np.median(X)
# 7.5
# 平均数
np.mean(X)
# 7.5
# 方差
np.var(X)
# 21.25
# 标准差
np.std(X)
# 4.6097722286464435
索引
索引计算
代码语言:javascript复制x = np.random.random(10)
#array([0.71822171, 0.70576053, 0.1875924 , 0.72647485, 0.42046641,
# 0.86504754, 0.23015792, 0.74155013, 0.84011022, 0.03290934])
np.min(x)
# 0.03290934121121092
np.argmin(x)
# 9
x[9]
# 0.03290934121121092
排序和使用索引
代码语言:javascript复制x = np.arange(16)
# array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
np.random.shuffle(x)
# array([ 1, 12, 8, 15, 2, 4, 11, 3, 9, 13, 6, 5, 14, 10, 7, 0])
x = np.arange(16).reshape(4,4)
#array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11],
# [12, 13, 14, 15]])
# 按行打乱
np.random.shuffle(x)
#array([[ 0, 1, 2, 3],
# [12, 13, 14, 15],
# [ 8, 9, 10, 11],
# [ 4, 5, 6, 7]])
fancy indexing
代码语言:javascript复制x = np.arange(16)
x[3]
# 3
# fancy indexing方法
ind = [3,5,8]
x[ind]
# array([3, 5, 8])
ind = np.array([[1,2],
[3,5]])
X = x.reshape(4,4)
#array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11],
# [12, 13, 14, 15]])
# 获取位置为指定位置元素
row = np.array([0,1,2])
col = np.array([1,2,3])
X[row,col]
# array([ 1, 6, 11])
# 获取位置第一行中所需列的元素
X[0, col]
# array([1, 2, 3])
array的比较
使用以下方法获得布尔矩阵
代码语言:javascript复制x
# array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
x < 3
# array([ True, True, True, False, False, False, False, False, False,
# False, False, False, False, False, False, False])
x<=3
# array([ True, True, True, True, False, False, False, False, False,
# False, False, False, False, False, False, False])
代码语言:javascript复制np.sum(x<=3)
# 4
np.count_nonzero(x<=3)
# 4
np.any(x==0)
# 有一个0就返回True
# True
np.any(x<0)
# False
np.sum((x>3) & (x<10))
# 6