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:将值分配给具有索引列表的二维数组的主要内容,如果未能解决你的问题,请参考以下文章

Python numpy 保留已排序二维数组的索引列表

Python构建二维数组获取列表分配索引超出范围

具有不同切片的二维 numpy 数组的平均值

python数据分析模块:numpy、pandas全解

将 2D numpy 数组重塑为 3 个具有 x,y 索引的 1D 数组

在二维矩阵中使用 numpy.nanargmin()