【问题标题】:Numpy: assigning values to 2d array with list of indicesNumpy:将值分配给具有索引列表的二维数组
【发布时间】: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)

有没有更矢量化的方式来做到这一点?

【问题讨论】:

    标签: python python-3.x numpy vectorization


    【解决方案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请删除第一个答案并相应更改文本。
    猜你喜欢
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 2015-06-16
    • 2018-08-01
    相关资源
    最近更新 更多