简单运算
现在有有个需求,给定一个数组,让数组中每一个数乘以2,怎么做呢
n = 10 L = [i for i in range(n)] L # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2 * L # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
A = [] for e in L: A.append(2*e) A # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
L = np.arange(n) 2 * L # array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
各种写法性能比较
n = 1000000 L = [i for i in range(n)] %%time A = [] for e in L: A.append(2*e) """ CPU times: user 253 ms, sys: 30 ms, total: 283 ms Wall time: 303 ms """ %%time A = [2*e for e in L] """ CPU times: user 93.6 ms, sys: 25.8 ms, total: 119 ms Wall time: 128 ms """ L = np.arange(n) %%time A = np.array(2*e for e in L) """ CPU times: user 15.1 ms, sys: 8.97 ms, total: 24.1 ms Wall time: 24.8 ms """ %%time A = 2 * L """ CPU times: user 15.1 ms, sys: 8.97 ms, total: 24.1 ms Wall time: 24.8 ms """
NumPy’s UFuncs (Universal Functions)
全称通用函数(universal function),是一种能够对数组中所有元素进行操作的函数
- 四则运算:加(+)、减(-)、乘(*)、除(/)、幂(**):数组间的四则运算表示对每个数组中的元素分别进行四则运算,所以形状必须相同
- 比较运算:>、<、==、>=、<=、!= :比较运算返回的结果是一个布尔数组,每个元素为每个数组对应元素的比较结果。
- 逻辑运算:np.any函数表示逻辑“or”,np.all函数表示逻辑“and” :运算结果返回布尔值
X = np.arange(1, 16).reshape((3, 5)) """ array([[ 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]) """ # 每个元素 + 1 X + 1 # 每个元素 - 1 X - 1 # 每个元素 * 2 X * 2 # 每个元素 / 2 X / 2 # 每个元素的平方 X ** 2 # 求余 X % 2 # 倒数 1 / X
还有下面等一系列方法
np.abs(X)
np.sin(X)
np.cos(X)
np.tan(X)
np.arctan(X)
np.exp(X)
np.exp2(X)
np.power(3, X)
np.log(X)
np.log2(X)
np.log10(X)
矩阵间运算
A = np.arange(4).reshape(2, 2) B = np.full((2, 2), 10) A + B A - B # ×乘,每个对应位置相乘 A * B # .乘,C11 = A的第一行*B的第一列,先乘后加 A.dot(B) # 转置 A.T # 返回自身的共轭转置 A.H # 返回自身的逆矩阵 A.I # 返回自身数据的2维数组的一个视图 A.A
向量和矩阵的运算
加法
A = np.arange(4).reshape(2, 2) v = np.array([1, 2]) v + A """ array([[1, 3], [3, 5]]) """
乘法
v * A """ array([[0, 2], [2, 6]]) """ v.dot(A) # array([4, 7]) A.dot(v) # array([2, 8])
矩阵的逆与伪逆
矩阵的逆
B = np.linalg.inv(A) A.dot(B) """ array([[1., 0.], [0., 1.]]) """
矩阵的伪逆
X = np.arange(16).reshape((2, 8)) pinvX = np.linalg.pinv(X) X.dot(pinvX) """ array([[ 1.00000000e+00, -2.77555756e-16], [ 1.69309011e-15, 1.00000000e+00]]) """
矩阵的伪逆又被称为“广义逆矩阵”
Numpy 中arg运算
x = np.random.normal(0, 1, 1000000) np.argmin(x) #获取最小值的下标 np.argmax(x)