Numpy 和 Python List 的差别
Numpy Array
1 2
| import numpy as np np.array([1,2,3,4])
|
[1 2 3 4]
List 和 Numpy Array 共同点
共同点:Numpy Array 和 List 都可以存储一组数据,并且支持索引和切片操作。
1 2 3 4 5 6 7 8 9 10 11 12 13
| # List的索引和切片操作 my_list = [1,2,3,4] print(my_list[0])
# Numpy Array的索引和切片操作 my_array = np.array([1,2,3,4]) print(my_array[0])
# 对内部值进行修改 my_list[0] = 10 my_array[0] = 10 print(my_list) print(my_array)
|
1
1
[10, 2, 3, 4]
[10 2 3 4]
Numpy Array 的优势
Numpy 的核心优势:运算快
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import time
t0 = time.time() # python list l = list(range(100)) for _ in range(10000): for i in range(len(l)): l[i] += 1 print(l)
t1 = time.time() # numpy array a = np.array(l) for _ in range(10000): a += 1 print(a)
print(f"Python list spend {(t1-t0):.3f}s") print(f"Numpy array spend {(time.time()-t1):.3f}s")
|
[10000, 10001, 10002, …, 10999]
[10000, 10001, 10002, …, 10999]
Python list spend 0.021s
Numpy array spend 0.000s
基本操作
维度很重要
Numpy的计算优势体现在可以处理多维数据
基本功能有:
- 创建数据
- 添加数据
- np.concatenate()
- np.expand_dims()
- 合并数据
- 观察数据
创建多维数据
例子:汽车百公里加速时间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| import numpy as np # 创建一维数据,只测一组数据 cars = np.array([5,10,12,6]) print("数据:", cars, "\n维度:", cars.ndim)
# 创建二维数据,多测几组数据 cars = np.array([ [5, 10, 12, 6], [5.1, 8.2, 11, 6.3], [4.4, 9.1, 10, 6.6] ])
print("数据:\n", cars, "\n维度:", cars.ndim)
# 创建三维数据,在不同场地测定 cars = np.array([ [[5, 10, 12, 6], [5.1, 8.2, 11, 6.3], [4.4, 9.1, 10, 6.6]],
[[5.2, 10.1, 12.3, 6.1], [5.3, 8.4, 11.2, 6.2], [4.5, 9.2, 10.4, 6.7]] ])
|
添加数据
n维到n维concatenate()

1 2 3 4 5
| # concatenate() 拼接数据 cars1 = np.array([5, 10, 12, 6]) cars2 = np.array([5.2, 4.2]) cars = np.concatenate([cars1, cars2]) print(cars)
|
n维到n+1维expand_dims()

1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # expand_dims() 添加维度 test1 = np.array([5, 10, 12, 6]) test2 = np.array([5.1, 8.2, 11, 6.3])
# 首先需要把它们都变成二维,下面这两种方法都可以加维度 test1 = np.expand_dims(test1, 0) test2 = test2[np.newaxis, :]
print("test1加维度后 ", test1) print("test2加维度后 ", test2)
# 然后再在第一个维度上叠加 all_tests = np.concatenate([test1, test2]) print("括展后\n", all_tests)
|
test1加维度后 [[ 5 10 12 6]]
test2加维度后 [[ 5.1 8.2 11. 6.3]]
括展后
[[ 5. 10. 12. 6. ]
[ 5.1 8.2 11. 6.3]]
合并数据
concatenate(, axis=0/1)
np.concatenate([all_tests, all_tests], axis=0)
1 2
| print("第一维度叠加:\n", np.concatenate([all_tests, all_tests], axis=0)) print("第二维度叠加:\n", np.concatenate([all_tests, all_tests], axis=1))
|
第一维度叠加:
[[ 5. 10. 12. 6. ]
[ 5.1 8.2 11. 6.3]
[ 5. 10. 12. 6. ]
[ 5.1 8.2 11. 6.3]]
第二维度叠加:
[[ 5. 10. 12. 6. 5. 10. 12. 6. ]
[ 5.1 8.2 11. 6.3 5.1 8.2 11. 6.3]]
np.vstack() 和 np.hstack()
vertical 竖直合并 vstack() 和 horizontal 水平合并 hstack()
1 2 3 4 5 6 7 8 9 10
| a = np.array([ [1,2], [3,4] ]) b = np.array([ [5,6], [7,8] ]) print("竖直合并\n", np.vstack([a, b])) print("水平合并\n", np.hstack([a, b]))
|
竖直合并
[[1 2]
[3 4]
[5 6]
[7 8]]
水平合并
[[1 2 5 6]
[3 4 7 8]]
观察形态
1 2 3 4 5 6 7 8 9
| cars = np.array([ [5, 10, 12, 6], [5.1, 8.2, 11, 6.3], [4.4, 9.1, 10, 6.6] ]) print("总共多少测试数据:", cars.size) print("第一个维度:", cars.shape[0]) print("第二个维度:", cars.shape[1]) print("所有维度:", cars.shape)
|
总共多少测试数据: 12
第一个维度: 3
第二个维度: 4
所有维度: (3, 4)
数据选择不迷茫
功能:
- 单个选取:
array[1]
array[1, 2, 3]
array[1][1]
- 切片划分
array[:3]
array[2:4, 1:3]
- 条件筛选
array[array > 5]
array[array < 5]
array[array == 5]
array[array != 5]
np.where(array, array < 0)
单个选取
一维数据单个单个的选择
1 2 3 4 5 6 7 8 9
| import numpy as np a = np.array([1,2,3]) # 取第一行数字 print("a[0]:", a[0]) # 取第二行数字 print("a[1]:", a[1]) # 一次性选多个 print("a[[0,1]]:\n", a[[0,1]]) print("a[[1,1,0]]:\n", a[[1,1,0]])
|
a[0]: 1
a[1]: 2
a[[0,1]]:
[1 2]
a[[1,1,0]]:
[2 2 1]
二维或者多维数据选取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| b = np.array([ [1,2,3,4], [5,6,7,8], [9,10,11,12] ])
# 选第 2 行所有数 print("b[1]:\n", b[1])
# 选第 2 行,第 1 列的数 print("b[1,0]:\n", b[1,0])
# 这个看着有点纠结,如果对应到数据, # 第一个拿的是数据位是 [1,2] # 第二个拿的是 [0,3] print("b[[1,0],[2,3]]:\n", b[[1,0], [2,3]])
|
切片划分
1 2 3 4
| a = np.array([1, 2, 3]) print("a[0:2]:\n", a[0:2]) print("a[1:]:\n", a[1:]) print("a[-2:]:\n", a[-2:])
|
1 2 3 4 5 6 7 8 9
| b = np.array([ [1,2,3,4], [5,6,7,8], [9,10,11,12] ])
print("b[:2]:\n", b[:2]) print("b[:2, :3]:\n", b[:2, :3]) print("b[1:3, -2:]:\n", b[1:3, -2:])
|
b[:2]:
[[1 2 3 4]
[5 6 7 8]]
b[:2, :3]:
[[1 2 3]
[5 6 7]]
b[1:3, -2:]:
[[ 7 8]
[11 12]]
条件筛选
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| a = np.array([ [1,2,3,4], [5,6,7,8], [9,10,11,12] ])
print(a[a>7])
condition = (a > 7) & (a != 10) print(a[condition])
# **np.where()** # 将符合条件的,替换为1,其余不变 condition = a > 7 print(np.where(condition, -1, a))
# 将符合条件的,替换为1,其余变为2 condition = a > 7 print(np.where(condition, -1, 2))
condition = a > 7 b = -a - 1 print(np.where(condition, a, b))
|