Numpy:将值分配给具有索引列表的二维数组
Posted
技术标签:
【中文标题】Numpy:将值分配给具有索引列表的二维数组【英文标题】:Numpy: assigning values to 2d array with list of indices 【发布时间】:2018-04-11 10:50:56 【问题描述】:我有 2d numpy 数组(想想灰度图像)。我想为该数组的坐标列表分配某个值,例如:
img = np.zeros((5, 5))
coords = np.array([[0, 1], [1, 2], [2, 3], [3, 4]])
def bad_use_of_numpy(img, coords):
for i, coord in enumerate(coords):
img[coord[0], coord[1]] = 255
return img
bad_use_of_numpy(img, coords)
这行得通,但我觉得我可以利用 numpy 功能使其更快。我以后也可能有一个用例,如下所示:
img = np.zeros((5, 5))
coords = np.array([[0, 1], [1, 2], [2, 3], [3, 4]])
vals = np.array([1, 2, 3, 4])
def bad_use_of_numpy(img, coords, vals):
for coord in coords:
img[coord[0], coord[1]] = vals[i]
return img
bad_use_of_numpy(img, coords, vals)
有没有更矢量化的方式来做到这一点?
【问题讨论】:
【参考方案1】:我们可以将coords
的每一行解包为行,列索引用于索引到img
,然后分配。
现在,既然问题被标记为:Python 3.x
,我们可以简单地用[*coords.T]
解包,然后分配-
img[[*coords.T]] = 255
一般来说,我们可以使用tuple
来解包-
img[tuple(coords.T)] = 255
我们也可以计算线性索引,然后用np.put
赋值 -
np.put(img, np.ravel_multi_index(coords.T, img.shape), 255)
【讨论】:
酷,谢谢@Divikar。除此之外,您的最后一种方法比前两种方法***倍,尽管我仍然不确定它是如何工作的。 @ymoiseev 在coords
中有足够多的分数,不过前两个应该会更快。
第一种方法img[[*coords.T]] = 255
现在会给你警告。建议现在使用第二种方法img[tuple(coords.T)] = 255
。
是的。 Using a non-tuple sequence for multidimensional indexing is deprecated
请删除第一个答案并相应更改文本。以上是关于Numpy:将值分配给具有索引列表的二维数组的主要内容,如果未能解决你的问题,请参考以下文章