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

posted on 2022-04-03 11:04  饮冰未  阅读(90)  评论(0编辑  收藏  举报