Как присвоить значения массиву numpy как функцию индекса?

1

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

Я хочу присвоить значения двумерному массиву в зависимости от их координат. Простейшим случаем было бы установить значение каждого элемента на свой второй индекс (например, x-координата). Таким образом,

x[0][0] = 0
x[1][0] = 0
...
x[2][0] = 0
x[0][1] = 1
x[0][2] = 2
...

Более сложным было бы установить эти значения на евклидово расстояние до некоторой точки (x, y).

Мое настоящее решение - использовать for-loop, который определенно неэффективен. Было бы хорошо провести векторизованную реализацию.

Моя текущая реализация:

x_mask = np.zeros((256, 256))
for i in range(256):
    for j in range(256):
        x_mask[i][j] = j
  • 0
    Ваш простой пример тривиален. В более сложных случаях вы должны попробовать векторизованное решение самостоятельно и сообщить нам, где вы застряли. Не существует «обобщенного способа» векторизации операции. Если бы было, нам бы не понадобились программисты :).
  • 0
    @jpp ожидал что-то вроде лямбда-выражения для каждой позиции. Я думаю, это работает одинаково хорошо, как только у меня есть координаты x / y в качестве вспомогательной матрицы для вычисления множества других вещей.
Теги:
arrays
numpy
performance
multidimensional-array

3 ответа

2
Лучший ответ

Вы можете назначить диапазон и воспользоваться вещанием NumPy:

A = np.zeros((256, 256))
A[:] = range(A.shape[1])
# or A[:] = np.arange(A.shape[1])

Выбранный вами метод будет зависеть от функции, которую вы хотите применить.

  • 0
    Работает отлично. Получить евклидово / манхэттенское расстояние было бы легко, если бы у меня тоже были координаты x / y, спасибо!
2

Кажется, что numpy.mgrid является правильным инструментом для этого (особенно если вы хотите как x, так и y).

Пример, скопированный из документации:

>>> np.mgrid[0:5,0:5]
array([[[0, 0, 0, 0, 0],
        [1, 1, 1, 1, 1],
        [2, 2, 2, 2, 2],
        [3, 3, 3, 3, 3],
        [4, 4, 4, 4, 4]],
       [[0, 1, 2, 3, 4],
        [0, 1, 2, 3, 4],
        [0, 1, 2, 3, 4],
        [0, 1, 2, 3, 4],
        [0, 1, 2, 3, 4]]]) 
0

Попробуй это:

a=[]
for i in range(4):
    b=[]
    for j in range(4):
        b.append(j)
    a.append(b)
  • 0
    ..Я не хочу использовать цикл for, как указано.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню