Python numpy присваивает значения 2D-массиву, используя другой массив с упорядоченными парами в качестве индексов для 2D-массива

#python #arrays #numpy #indexing

#python #массивы #numpy #индексирование

Вопрос:

Это трудно описать словами, но легко увидеть на практике. У меня есть 2D-массив:

 im = np.array([[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]])
  

Я интерпретирую это как изображение в оттенках серого 4×4, поэтому значения в массиве — это просто интенсивности. Итак, для начала, im это:

 [[0,0,0,0],
 [0,0,0,0],
 [0,0,0,0],
 [0,0,0,0]]
  

Я хочу иметь возможность изменять множество значений в «изображении» одновременно в соответствии с массивом значений x и массивом значений y. Я собираю их, чтобы они выглядели как упорядоченные пары во втором массиве, подобном этому:

 x = [0,1]
y = [2,3]
coords = np.array([x,y]).T
  

Теперь coords выглядит так:

 array([[0, 2],
       [1, 3]])
  

Наконец, я хочу проиндексировать im по координатам. Я подумал, возможно, это было что-то вроде этого:

 im[coords] = 9
  

…но это не работает. Я бы хотел, чтобы конечный результат im был:

 [[0,0,9,0],
 [0,0,0,9],
 [0,0,0,0],
 [0,0,0,0]]
  

Кто-нибудь знает быстрый и элегантный способ сделать это?

Спасибо!

Комментарии:

1. im[x, y] = 9 Работает?

2. ха-ха … да, действительно так! Я мог бы поклясться, что я пробовал это! Ну что ж, это не самая глупая вещь, которую я делал в последнее время, но она прямо там 🙂

Ответ №1:

Вы можете просто сделать im[x,y] = 9 .

пример:

 im = np.array([[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]])
x = [0,1]
y = [2,3]
im[x,y] = 9
print(im)
# Result:
# array([[0, 0, 9, 0],
#        [0, 0, 0, 9],
#        [0, 0, 0, 0],
#        [0, 0, 0, 0]])
  

Комментарии:

1. Это просто повторяет то, что было сказано в комментариях

Ответ №2:

В общем, если у вас есть массив numpy

 import numpy as np
arr = np.array([[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]])
x_coords = [0, 1]
y_coords = [2, 3]
values = [8, 9]
  

затем

 arr[x, y] = values
  

приведет к

   array([
        [0, 0, 8, 0],
        [0, 0, 0, 9],
        [0, 0, 0, 0],
        [0, 0, 0, 0]
        ])
  

Комментарии:

1. Это просто повторяет то, что было сказано в комментариях

2. @RafaelC Я также хотел добавить, что вы также можете предоставить список значений, который не был приведен в комментариях.