numpy广播机制与高级索引使用

numpy广播机制与高级索引使用

NumPy 比一般的 Python 序列提供更多的索引方式。

除了整数和切片的索引外,数组可以由整数数组索引、布尔索引及花式索引。

  1. 类型转换
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
  1. 整数数组索引

以数组为索引

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]]
  1. 布尔索引
    通过布尔数组进行索引
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]
  1. 花式索引
    花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。
    对一维数组来说,索引的结果是对应位置的元素
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]]
  1. 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" 异常。

posted @ 2023-01-20 16:54  openwindow_cc  阅读(53)  评论(0)    收藏  举报