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.array()
    • array.ndim
  • 添加数据
    • np.concatenate()
    • np.expand_dims()
  • 合并数据
    • np.vstack()
    • np.hstack()
  • 观察数据
    • array.size
    • array.shape

创建多维数据

例子:汽车百公里加速时间

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

alt text

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

alt text

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