numpy广播机制与高级索引使用
NumPy 比一般的 Python 序列提供更多的索引方式。
除了整数和切片的索引外,数组可以由整数数组索引、布尔索引及花式索引。
- 类型转换
import numpy as np
a = np.array(
[
[1,2,3,4],
[5,6,7,8]
])
print(a.shape) # (2, 4)
print(a.dtype) # int32
b = a * 2.0
print(b.dtype) # float64
c = b.astype(np.float32)
print(c.dtype) # float32
d = a + b + c
print(d.dtype) # float64
- 整数数组索引
以数组为索引
import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6]])
rows = [0,1,2]
cols = [0,1,0]
y = x[rows, cols]
print (y) # -[1,4,5] 分别取x中(0,0)(1,1)(2,0)处的元素
用..省略前几个维度,只对最后几个维度做切片
a = np.array([[1,2,3], [4,5,6],[7,8,9]])
b = a[1:3, 1:3]
c = a[1:3,[1,2]]
d = a[...,1:]
print(b) # [[5 6] [8 9]]
print(c) # [[5 6] [8 9]]
print(d) # [[2 3] [5 6] [8 9]]
- 布尔索引
通过布尔数组进行索引
a = np.array(
[
[1,2,3,4],
[5,6,7,8]
]
)
b = np.array(
[
[1,1,3,3],
[5,6,7,8]
]
)
c = (a==b)
print(c)
print(c.dtype, c.shape)
# [[ True False True False]
# [ True True True True]]
# bool (2, 4)
e = a[b>5]
print(e)
# [6 7 8]
- 花式索引
花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。
对一维数组来说,索引的结果是对应位置的元素
import numpy as np
x = np.arange(9)
x2 = x[[0,6]]
print(x2) # [0 6]
对二维数组来说,索引的结果的对应下标的行
import numpy as np
x = np.arange(8).reshape((4,2))
print(x)
print(x[[0,2]])
# [[0 1]
# [2 3]
# [4 5]
# [6 7]]
# [[0 1]
# [4 5]]
- NumPy广播(Broadcast)
广播是numpy对不同形状的数组进行数值计算的方式。
- 如果数组a、b形状相同,即a.shape==b.shape
那么a*b的结果就是ayub数组相应位置相乘。
import numpy as np
a = np.array([1,2,3,4])
b = np.array([10,20,30,40])
c = a * b
print (c)
# [10, 40, 90, 160]
- 当运算中的2个数组形状不同时,numpy将触发广播机制
import numpy as np
a = np.array([
[0,0,0],
[10,10,10],
[20,20,20],
[30,30,30]
])
b = np.array([0,1,2])
print(a+b)
# [[ 0 1 2]
# [10 11 12]
# [20 21 22]
# [30 31 32]]
import numpy as np
a = np.zeros([3,4,2,3,2])
b = np.ones([2,3,2])
print(a+b)
# 但是a = np.zeros([3,4,4,3,2])就会报错,倍数是不行的!
简单来说,广播机制就是在不足的维度上进行复制拓展
广播的规则:
(1)让所有数组都向其中维度最大的数组看齐,不足在前面补1.
(2)输出数组的形状是输入数组形状的各个维度上的最大值
(3)进行广播的某个维度的长度需要与输出数组对应长度相等或者为1.
若条件不满足,抛出 "ValueError: frames are not aligned" 异常。