array数据基本属性

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数据访问

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

切片操作

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

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]])

求转置矩阵

A.T
#array([[0, 2],
#       [1, 3]])

向量和矩阵计算

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矩阵

求逆矩阵等相关操作

# 求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.]])
# 矩阵乘以矩阵的逆等于单位矩阵,符合定义

在某些情况下,大部分矩阵没有逆,需要求伪逆矩阵

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()的对比

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

np.min(big_array)
#9.593480820857536e-08
np.max(big_array)
#0.9999999664721

矩阵中的聚合操作

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

索引

索引计算

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

排序和使用索引

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

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的比较

使用以下方法获得布尔矩阵

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])
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
Last modification:March 26th, 2020 at 10:28 pm