0%

Python学习笔记04

资料:GitHub:100 NumPy Exercises

IDE:Spyder

导入numpy
1
import numpy as np
查询array所占内存
1
2
z01 = np.zeros((10, 10))
print("%d bytes" % (z01.size * z01.itemsize))
矢量倒序
1
2
z02 = np.arange(10)
z02 = z02[::-1]
索引非零元素位置
1
z03 = np.nonzero([1, 2, 0, 0, 4, 0])
随机array的极值 & 平均值
1
2
3
z04 = np.random.random((3, 3, 3))
Zmin, Zmax = z04.min(), z04.max()
Zm = z04.mean()
伪对角阵
1
2
z05 = np.diag(1+np.arange(4), k = -1)
z06 = np.diag(1+np.arange(4), k = +1)
由元素存储位置得到其索引
1
2
np.unravel_index(9, (7, 8))
np.unravel_index(99, (6, 7, 8)) # (D, R, C)
伪正态分布的随机数
1
2
z07 = np.random.random((5, 5))
z08 = (z07 - np.mean(z07)) / (np.std(z07)) # std: 标准差
逻辑索引
1
2
z09 = np.arange(10)
z09[(3 < z09) & (z09 < 8)] *= -1
sum & np.sum
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
z10 = [1, 2, 3]
z11 = np.array(z10)
sum(z10) == np.sum(z10) # True
sum(z11) == np.sum(z11) # True

sum(z11, 1) # sum补充元素并求和, 7
np.sum(z11, 0) # 等价于np.sum(z11, axis=0)
sum(z11, -1) == np.sum(z11, -1) # False, 5!=6

z12 = [[1, 2, 3], [-1, -2, -3]]
z13 = np.array(z12)
np.sum(z12, axis = 0) # array([0, 0, 0])
np.sum(z12, axis = 1) # array([6, -6])
sum(z12) # TypeError
sum(z13) # array([0, 0, 0])
sum(z13, 5) # array([5, 5, 5])
闰年二月29天
1
2
z14 = np.arange('2020-02', '2020-03', dtype='datetime64[D]')
z14.size
linspace
1
z15 = np.linspace(0,1,6,endpoint=False)[1:]
查询最大值位置
1
2
z16 = np.random.randn(3, 3)
z16[z16==z16.max()] = +1
自定义dtype:坐标存储
1
2
z17 = np.zeros((5, 5), [('x', float), ('y', float)])
z17['x'], z17['y'] = np.meshgrid(np.linspace(0, 1, 5), np.linspace(0, 1, 5))
加减乘除运算的扩展
1
2
3
4
5
6
X = np.arange(3)
Y = X + 0.5
z18 = np.add.outer(X, Y) # z18[i,j] = X[i] + Y[j]
z19 = np.subtract.outer(X, Y) # z19[i,j] = X[i] - Y[j]
z20 = np.multiply.outer(X, Y) # z20[i,j] = X[i] * Y[j]
z21 = np.divide.outer(X, Y) # z21[i,j] = X[i] / Y[j]
若干点中距离最远 & 最近的两个点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import scipy as sp

num = 777
P = np.random.random((num, 3)) # 空间坐标
D = sp.spatial.distance.cdist(P, P)

index1 = D.argmax()
imax1 = index1 // num + 1 # 最远的点编号, 从1开始
imax2 = index1 % num + 1 # 最远的点编号, 从1开始
temp = P[imax1 - 1, :] - P[imax2 - 1, :]
print(np.sqrt(sum(temp * temp)) == D.max()) # 验证


D[D==0] = D.max()
index2 = D.argmin()
imin1 = index2 // num + 1 # 最近的点编号, 从1开始
imin2 = index2 % num + 1 # 最近的点编号, 从1开始
temp = P[imin1 - 1, :] - P[imin2 - 1, :]
print(np.sqrt(sum(temp * temp)) == D.min()) # 验证
按第零列排序
1
2
z22 = np.random.randint(0, 10, (3, 3))
z22[z22[:, 0].argsort()]
交换array的两行
1
2
z23 = np.arange(25).reshape(5, 5)
z23[[0, 1]] = z23[[1, 0]]
时间复杂度
1
2
3
4
z24 = np.random.rand(int(5e7))
%timeit np.power(z24, 3) # 1.6 s
%timeit z24 * z24 * z24 # 208 ms
%timeit np.einsum('i,i,i->i', z24, z24, z24) # 220 ms
Einstein求和约定
1
2
3
4
5
6
7
8
A = np.random.uniform(0, 1, 10)
B = np.random.uniform(0, 1, 10)

np.einsum('i->', A) # np.sum(A)
np.einsum('i,i->i', A, B) # A * B
np.einsum('i,j->i', A, B) # A * np.sum(B)
np.einsum('i,i', A, B) # np.inner(A, B)
np.einsum('i,j->ij', A, B) # np.outer(A, B)