Подтвердить что ты не робот

Индексирование 2D-массива Python numpy

Я новичок в python и numpy. Может ли кто-нибудь помочь мне понять, как я могу сделать индексацию некоторых массивов, используемых в качестве индексов. У меня есть следующие шесть 2D-массивов вроде этого -

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

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

array([[ 0,  0,  0],
   [ 0,  0,  0],
   [10,  0,  0],
   [10, 10,  0],
   [ 0,  0,  0],
   [10, 10, 10]])

До сих пор я пробовал это -

    from numpy import*
    a = array([[2,0],[3,0],[3,1],[5,0],[5,1],[5,2]])
    b = zeros((6,3),dtype ='int32')
    b[a] = 10

Но это дает мне неправильный результат. Любая помощь.

4b9b3361

Ответ 1

In [1]: import numpy as np
In [2]: a = np.array([[2,0],[3,0],[3,1],[5,0],[5,1],[5,2]])
In [3]: b = np.zeros((6,3), dtype='int32')

In [4]: b[a[:,0], a[:,1]] = 10

In [5]: b
Out[5]: 
array([[ 0,  0,  0],
       [ 0,  0,  0],
       [10,  0,  0],
       [10, 10,  0],
       [ 0,  0,  0],
       [10, 10, 10]])

Почему это работает:

Если вы индексируете b с двумя массивами numpy в присваивании,

b[x, y] = z

тогда подумайте о том, что NumPy перемещается одновременно по каждому элементу x и каждому элементу y и каждому элементу z (назовем их xval, yval и zval) и присваивая на b [xval, yval] значение zval. Когда z является константой, "перемещение по z просто возвращает одно и то же значение каждый раз.

Это то, что мы хотим, причем x является первым столбцом a и y, являющимся вторым столбцом a. Таким образом, выберите x = a[:, 0] и y = a[:, 1].

b[a[:,0], a[:,1]] = 10

Почему b[a] = 10 не работает

Когда вы пишете b[a], подумайте о NumPy как о создании нового массива, перемещаясь по каждому элементу a (позвольте каждому из них idx) и поместив в новый массив значение b[idx] at расположение idx в a.

idx - значение в a. Так что это int32. b имеет форму (6,3), поэтому b[idx] представляет собой строку b формы (3). Например, когда idx есть

In [37]: a[1,1]
Out[37]: 0

b[a[1,1]] является

In [38]: b[a[1,1]]
Out[38]: array([0, 0, 0])

So

In [33]: b[a].shape
Out[33]: (6, 2, 3)

Итак, повторите: NumPy создает новый массив, перемещаясь по каждому элементу a и помещая в новый массив значение b[idx] в местоположении idx в a. По мере того как idx перемещается по a, будет создан массив формы (6,2). Но так как b[idx] сам по себе имеет форму (3), то в каждом месте в (6,2) -образном массиве помещается значение (3,). Результатом является массив формы (6,2,3).

Теперь, когда вы выполняете задание типа

b[a] = 10

создается временный массив формы (6,2,3) со значениями b[a], тогда выполняется присвоение. Поскольку 10 является константой, это присваивание помещает значение 10 в каждое место в (6,2,3) -образном массиве. Затем значения из временного массива перенаправляются обратно на b. См. ссылка на документы. Таким образом, значения в (6,2,3) -образном массиве копируются обратно в массив (6,3) -образный b. Значения переписывают друг друга. Но главное - вы не получаете заданий, которые вы желаете.