Numpy入门笔记2

2022-06-19 17:29:57 浏览数 (1)

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计算都是针对每个元素的

代码语言:javascript复制
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]])

以下进行加减乘除取余乘方等操作都是矩阵对应元素之间进行对应的计算

代码语言:javascript复制
A B
#array([[0, 2],
#       [4, 6]])
A*B
#array([[0, 1],
#       [4, 9]])

如果要进行矩阵乘法,需要使用dot方法

代码语言:javascript复制
# 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

0 人点赞