numpy.array中的计算
给定一个向量,让向量中的 数乘以2
a = (0, 1, 2), a * 2 = (0, 2 ,4)
n = 10
L = [i for i in range(n)]
L
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 直接用L*2得到的结果是两个L前后拼接
L * 2
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
#所以采用如下方法
a = []
for i in range(n):
a.append(2 * i)
a
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
循环的效率低,用 %%time命令可测(%%time 命令必须放在单元的首行)
%%time
n = 1000000
a = []
for i in range(n):
a.append(2 * i)
Wall time: 243 ms
%%time
a = [i * 2 for i in range(n)]
Wall time: 162 ms
使用numpy的效率
import numpy as np
%%time
L = np.arange(n)
a = np.array(i * 2 for i in L)
Wall time: 19.9 ms
numpy支持数组直接与数字相乘的操作
%%time
a = L * 2
Wall time: 0 ns
n = 10
L = np.arange(n)
a = L * 2
a
array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
Universal Functions
X = np.arange(1, 16).reshape(3, 5)
X
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15]])
X + 1
array([[ 2, 3, 4, 5, 6],
[ 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16]])
X - 1
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
X * 2
array([[ 2, 4, 6, 8, 10],
[12, 14, 16, 18, 20],
[22, 24, 26, 28, 30]])
X / 2
array([[0.5, 1. , 1.5, 2. , 2.5],
[3. , 3.5, 4. , 4.5, 5. ],
[5.5, 6. , 6.5, 7. , 7.5]])
X // 2
#除法取整操作
array([[0, 1, 1, 2, 2],
[3, 3, 4, 4, 5],
[5, 6, 6, 7, 7]], dtype=int32)
X % 2
array([[1, 0, 1, 0, 1],
[0, 1, 0, 1, 0],
[1, 0, 1, 0, 1]], dtype=int32)
X ** 2
array([[ 1, 4, 9, 16, 25],
[ 36, 49, 64, 81, 100],
[121, 144, 169, 196, 225]], dtype=int32)
1 / X
array([[1. , 0.5 , 0.33333333, 0.25 , 0.2 ],
[0.16666667, 0.14285714, 0.125 , 0.11111111, 0.1 ],
[0.09090909, 0.08333333, 0.07692308, 0.07142857, 0.06666667]])
### numpy.abs(), numpy.sin(), numpy.cos(), numpy.tan(), numpy.exp(), numpy.power(), numpy.log(), numpy.log2(), numpy.log10()
np.abs(X)
#绝对值
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15]])
np.sin(X)
array([[ 0.84147098, 0.90929743, 0.14112001, -0.7568025 , -0.95892427],
[-0.2794155 , 0.6569866 , 0.98935825, 0.41211849, -0.54402111],
[-0.99999021, -0.53657292, 0.42016704, 0.99060736, 0.65028784]])
np.tan(X)
array([[ 1.55740772e+00, -2.18503986e+00, -1.42546543e-01,
1.15782128e+00, -3.38051501e+00],
[-2.91006191e-01, 8.71447983e-01, -6.79971146e+00,
-4.52315659e-01, 6.48360827e-01],
[-2.25950846e+02, -6.35859929e-01, 4.63021133e-01,
7.24460662e+00, -8.55993401e-01]])
np.exp(X)
#以e为底数求幂
array([[2.71828183e+00, 7.38905610e+00, 2.00855369e+01, 5.45981500e+01,
1.48413159e+02],
[4.03428793e+02, 1.09663316e+03, 2.98095799e+03, 8.10308393e+03,
2.20264658e+04],
[5.98741417e+04, 1.62754791e+05, 4.42413392e+05, 1.20260428e+06,
3.26901737e+06]])
np.power(3, X)
#以3为底求幂
array([[ 3, 9, 27, 81, 243],
[ 729, 2187, 6561, 19683, 59049],
[ 177147, 531441, 1594323, 4782969, 14348907]], dtype=int32)
np.log(X)
array([[0. , 0.69314718, 1.09861229, 1.38629436, 1.60943791],
[1.79175947, 1.94591015, 2.07944154, 2.19722458, 2.30258509],
[2.39789527, 2.48490665, 2.56494936, 2.63905733, 2.7080502 ]])
np.log2(X)
array([[0. , 1. , 1.5849625 , 2. , 2.32192809],
[2.5849625 , 2.80735492, 3. , 3.169925 , 3.32192809],
[3.45943162, 3.5849625 , 3.70043972, 3.80735492, 3.9068906 ]])
矩阵运算
A = np.arange(0, 4).reshape(2, 2)
A
array([[0, 1],
[2, 3]])
B = np.full((2, 2), 10)
B
array([[10, 10],
[10, 10]])
A + B
array([[10, 11],
[12, 13]])
A - B
array([[-10, -9],
[ -8, -7]])
A * B
#这里的乘法是对应元素相乘
array([[ 0, 10],
[20, 30]])
A / B
#对应元素相除
array([[0. , 0.1],
[0.2, 0.3]])
#真正的矩阵乘法是
A.dot(B)
array([[10, 10],
[50, 50]])
#矩阵的转置
A.T
array([[0, 2],
[1, 3]])
向量和矩阵的运算
a = np.array([1, 2])
a + A
#这在数学上无意义,尽管他在python中可以实现
#具体操作是将a与A的每一行相加
array([[1, 3],
[3, 5]])
A.shape
(2, 2)
np.vstack([a] * A.shape[0])
array([[1, 2],
[1, 2]])
np.vstack([a] * A.shape[0]) + A
array([[1, 3],
[3, 5]])
向量的堆叠 np.tile()
np.tile(a, (2, 2))
#(x, y)中x表示在行上堆叠几次,y表示在列上堆叠几次
array([[1, 2, 1, 2],
[1, 2, 1, 2]])
np.tile(a, (2, 1)) + A
array([[1, 3],
[3, 5]])
a * A
#其结果是a的每一行去和A的每一行对应元素相乘,并不是矩阵乘法
array([[0, 2],
[2, 6]])
#矩阵乘法同样要使用 .dot()
a.dot(A)
array([4, 7])
A.dot(a)
#这在数学中是不成立的,但是numpy将a当做一个列向量处理
array([2, 8])
矩阵的逆矩阵
A
array([[0, 1],
[2, 3]])
np.linalg.inv(A)
#linear algebra的缩写
array([[-1.5, 0.5],
[ 1. , 0. ]])
invA = np.linalg.inv(A)
A.dot(invA)
#单位阵
array([[1., 0.],
[0., 1.]])
对于不是仿真的矩阵,可以求其伪逆矩阵
X = np.arange(12).reshape(2, 6)
X
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
pinvX = np.linalg.pinv(X)
pinvX
array([[-0.23015873, 0.08730159],
[-0.14920635, 0.06349206],
[-0.06825397, 0.03968254],
[ 0.01269841, 0.01587302],
[ 0.09365079, -0.00793651],
[ 0.17460317, -0.03174603]])
pinvX.shape
(6, 2)
X.dot(pinvX)
array([[ 1.00000000e+00, -6.93889390e-17],
[-2.22044605e-16, 1.00000000e+00]])