Первые два должны быть быстрее, хотя.

я есть 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 в строке, индексы col для индексации в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)
 ymoiseev30 окт. 2017 г., 15:10
Круто, спасибо @Divikar. Просто добавим, что ваш последний метод в три раза быстрее первых двух, хотя я до сих пор не уверен, как именно он работает.
 Divakar30 окт. 2017 г., 15:20
@ymoiseev Учитывая достаточно очков вcoordsПервые два должны быть быстрее, хотя.

Ваш ответ на вопрос