如何利用字典键值对初始化NumPy数组指定位置的值?
解决NumPy多通道数组按字典批量赋值的问题
你的代码执行失败,是因为locations是元组组成的列表,NumPy无法直接用这种格式进行索引。要实现无需遍历键值对的批量赋值,可以用以下两种矢量化方法:
方法一:用zip拆分坐标
通过zip(*...)将字典键中的行、列坐标分别提取为独立的可迭代对象,直接用于数组索引赋值:
import numpy as np arr = np.zeros((6, 4, 3), dtype=np.float32) values_of_channel_0 = { (0, 2) : 1, (1, 0) : 1, (1, 3) : 5, (2, 1) : 2, (2, 2) : 3, (2, 3) : 1, (3, 0) : 1, (3, 2) : 2, (4, 0) : 2, (4, 2) : 20, (5, 0) : 1, (5, 2) : 10, (5, 3) : 1 } # 拆分键中的行和列坐标 rows, cols = zip(*values_of_channel_0.keys()) # 为第0通道的指定位置赋值 arr[rows, cols, 0] = list(values_of_channel_0.values())
方法二:用NumPy数组转换坐标
将字典的键转换为二维NumPy数组,通过切片提取行、列索引:
coords = np.array(list(values_of_channel_0.keys())) # 取数组第一列作为行索引,第二列作为列索引,赋值第0通道 arr[coords[:, 0], coords[:, 1], 0] = list(values_of_channel_0.values())
这两种方法都属于NumPy的矢量化操作,效率远高于遍历键值对,且代码简洁优雅。
内容的提问来源于stack exchange,提问作者Elad Maimoni
相关产品推荐
相关产品推荐

