无需迭代通过索引对更新2D numpy数组的实现方法
问题:NumPy无循环批量给2D数组指定索引位置赋值
可复现环境
我有一个包含n对索引的数组:
indexarray=\ np.array([[0,2,4,6], [1,3,5,7]])
同时有一个2D数组:
zeros = np.zeros((10,9))
以及长度为n的数值列表:
values = [1,2,3,4]
我需要将values列表的第k个元素赋值给zeros数组中索引为第k组索引对的位置。
现有解决方案
# 可运行,但for循环不适合实际生产场景 for index, (row, col) in enumerate(indexarray.T): zeros[row, col] = values[index]
运行后可视化结果如下:
plt.imshow(zeros)

结果符合预期,但使用了迭代循环。
请问如何不使用迭代实现该需求?
相似但不同的问题
- Index 2D numpy array by a 2D array of indices without loops:该问题输出为索引对数组,而非本场景需要的2D数组。
- Fill 2D numpy array from three 1D numpy arrays:该场景更复杂,是从1D数组生成2D数组,与本场景已有2D数组的前提不同。
- numpy arrays: filling and extracting data quickly:场景复杂度更高,并非基于已有2D数组操作。
- How to convert List of Lists of Tuples- pairs (index,value) into 2D numpy array:目标不同,且未避免使用循环。
解答
直接使用NumPy原生的高级索引特性即可实现无循环批量赋值,代码如下:
zeros[indexarray[0], indexarray[1]] = values
实现原理
NumPy支持传入两个等长的一维数组分别作为行、列索引,一次性选中多个离散位置的元素进行批量操作,所有运算都在C层级执行,相比Python层的for循环性能提升非常明显,完全满足生产环境的性能要求。
执行后得到的结果和原有循环实现完全一致,可直接用原有可视化代码验证。
内容的提问来源于stack exchange,提问作者zabop
相关产品推荐
相关产品推荐

