Numpy
丹丹

生成数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# -*- coding: utf-8 -*-
import numpy as np

print("===使用普通一维数组生成NumPy一维数组===")
data = [6, 7.5, 8, 0, 1]
arr = np.array(data)
print(arr)
print(arr.dtype) # 类型
print('')

print("===使用普通二维数组生成NumPy二维数组===")
data = [[1, 2, 3, 4], [5, 6, 7, 8]]
arr = np.array(data)
print(arr)
print(arr.shape) # 维度
print('')

print("===使用内置函数创建数组===")
print(np.zeros(10)) # 生成包含10个0的一维数组
print(np.zeros((3, 6))) # 生成3*6的二维数组
print(np.empty((2, 3, 2))) # 生成2*3*2的三维数组,所有元素未初始化。
print(np.empty_like((2, 3, 2))) # 生成2*3*2的三维数组,所有元素未初始化。
print(np.ones((1,2)))
print(np.full((2,2), 8))
print(np.eye(3))
print(np.random.random((3,2)))
print('')

print("===使用arrange生成连续元素===")
print(np.arange(15)) # [0, 1, 2, ..., 14]
print('')

print("===broadcasting===")
print(np.arange(3).reshape((3,1))+np.arange(3))
===使用普通一维数组生成NumPy一维数组===
[6.  7.5 8.  0.  1. ]
float64

===使用普通二维数组生成NumPy二维数组===
[[1 2 3 4]
 [5 6 7 8]]
(2, 4)

===使用内置函数创建数组===
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[[0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0.]]
[[[4.9e-324 9.9e-324]
  [1.5e-323 2.0e-323]
  [2.5e-323 3.0e-323]]

 [[3.5e-323 4.0e-323]
  [4.4e-323 4.9e-323]
  [5.4e-323 5.9e-323]]]
[4607182418800017408 4607182418800017408 4607182418800017408]
[[1. 1.]]
[[8 8]
 [8 8]]
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
[[0.46824109 0.9710855 ]
 [0.41688259 0.20446181]
 [0.31828888 0.2797158 ]]

===使用arrange生成连续元素===
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]

===broadcasting===
[[0 1 2]
 [1 2 3]
 [2 3 4]]

堆叠

1
2
3
4
5
x = np.array([[1,2],[3,4]], dtype=np.float64)
y = np.array([[5,6],[7,8]], dtype=np.float64)

print(np.hstack((x,y)))
print(np.vstack((x,y)))
[[1. 2. 5. 6.]
 [3. 4. 7. 8.]]
[[1. 2.]
 [3. 4.]
 [5. 6.]
 [7. 8.]]

运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
x = np.array([[1,2],[3,4]], dtype=np.float64)
y = np.array([[5,6],[7,8]], dtype=np.float64)

print("===逐元素运算===")
print(x+y)
print(x-y)
print(x*y)
print(x/y)
print(np.sqrt(x))
print('')

print("===矩阵内元素运算===")
print(x.sum())
print(np.sum(x, axis=0))
print(np.sum(x, axis=1))
print(np.mean(x))
print(np.mean(x, axis=0))
print(np.mean(x, axis=1))
print(x.cumsum(axis=0))
print(x.cumsum(axis=1))
print(x.cumprod(axis=0))
print(x.cumprod(axis=1))
===逐元素运算===
[[ 6.  8.]
 [10. 12.]]
[[-4. -4.]
 [-4. -4.]]
[[ 5. 12.]
 [21. 32.]]
[[0.2        0.33333333]
 [0.42857143 0.5       ]]
[[1.         1.41421356]
 [1.73205081 2.        ]]
===矩阵内元素运算===
10.0
[4. 6.]
[3. 7.]

索引/切片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
print("===通过索引访问二维数组某一行或某个元素===")
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[2])
print(arr[0][2])
print(arr[0, 2]) # 普通Python数组不能用。
print('')

print("===对更高维数组的访问和操作===")
arr = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
print(arr[0]) # 结果是个2维数组
print(arr[1, 0]) # 结果是个2维数组
old_values = arr[0].copy() # 复制arr[0]的值
arr[0] = 42 # 把arr[0]所有的元素都设置为同一个值
print(arr)
arr[0] = old_values # 把原来的数组写回去
print(arr)
print('')

print("===使用切片访问和操作数组===")
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(arr[1:6]) # 打印元素arr[1]到arr[5],和list切片不同,这里是引用。
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[:2]) # 打印第1、2行
print(arr[:2, 1:]) # 打印第1、2行,第2、3列
print(arr[:, :1]) # 打印第一列的所有元素
arr[:2, 1:] = 0 # 第1、2行,第2、3列的元素设置为0
print(arr)

===通过索引访问二维数组某一行或某个元素===
[7 8 9]
3
3

===对更高维数组的访问和操作===
[[1 2 3]
 [4 5 6]]
[7 8 9]
[[[42 42 42]
  [42 42 42]]

 [[ 7  8  9]
  [10 11 12]]]
[[[ 1  2  3]
  [ 4  5  6]]

 [[ 7  8  9]
  [10 11 12]]]

===使用切片访问和操作数组===
[2 3 4 5 6]
[[1 2 3]
 [4 5 6]]
[[2 3]
 [5 6]]
[[1]
 [4]
 [7]]
[[1 0 0]
 [4 0 0]
 [7 8 9]]

矩阵

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import numpy as np
import numpy.linalg as la
import time

X = np.array([range(0, 500), range(500, 1000)])
m, n = X.shape
print(m, n)

'''
D(i, j) = ||xi - xj||^2
'''
t = time.time()
D = np.zeros([n, n])
for i in range(n):
for j in range(i + 1, n):
D[i, j] = la.norm(X[:, i] - X[:, j]) ** 2
D[j, i] = D[i, j]
print(time.time() - t)

'''
|xi - xi| = sqrt((xi - xj) * (xi - xj).T)
D(i, j) = (xi - xj) * (xi - xj).T
'''
t = time.time()
D = np.zeros([n, n])
for i in range(n):
for j in range(i + 1, n):
d = X[:, i] - X[:, j]
D[i, j] = np.dot(d, d)
D[j, i] = D[i, j]
print(time.time() - t)

'''
D(i, j) = (xi - xj) * (xi - xj).T
= xi * xi.T - xi * xj.T - xj * xi.T + xj * xj.T
= xi * xi.T - 2 * xi * xj.T + xj * xj.T
G(i,j) = xi.T * xj
'''
t = time.time()
G = np.dot(X.T, X)
D = np.zeros([n, n])
for i in range(n):
for j in range(i + 1, n):
D[i, j] = G[i, i] - G[i, j] * 2 + G[j,j]
D[j, i] = D[i, j]
print(time.time() - t)

'''
H(i, j) = G(i, i)
K(i, j) = G(j, j) = H(i, j).T
D(i, j) = H(i, j) + K(i, j) - 2 * G(i, j)
'''
t = time.time()
G = np.dot(X.T, X)
H = np.tile(np.diag(G), (n, 1)) # n rows, 1 for each row
D = H + H.T - G * 2
print(time.time() - t)

2 500
1.8900527954101562
0.6348848342895508
0.25273704528808594
0.02255988121032715

参考:

  1. 廖雪峰Python数据分析