Как заменить значения 2d-массива массивом индексов в python

#python #arrays #numpy #indexing

Вопрос:

Я намерен заменить значение конкретных индексов на основе массива индексов. Исходный 2d-массив выглядит следующим образом:

     A=    [[0.         0.         0.         0.         0.         0.         0.        ]    

           [0.         1.98019867 1.96039735 1.90331502 1.81546888 1.70634771 0.        ]

           [0.         2.         1.98019867 1.92311635 1.83527021 1.72614904 0.        ]

           [0.         1.98019867 1.96039735 1.90331502 1.81546888 1.70634771 0.        ]

           [0.         1.92311635 1.90331502 1.84623269 1.75838656 1.64926538 0.        ]

           [0.         1.83527021 1.81546888 1.75838656 1.67054042 1.56141925 0.        ]

           [0.         0.         0.         0.         0.         0.         0.        ]]
 

и это массив индексов (в каждой строке каждая пара указывает индекс)

     index=[[1 2]
 [2 4]
 [3 4]
 [3 5]
 [4 2]
 [5 2]
 [5 5]]
 

и я хочу заменить значение этих индексов в массиве A на :

 zero=0
 

Я хочу, чтобы конечный результат был примерно таким:

 modified_A=    [[0.         0.         0.         0.         0.         0.        0.        ]

                [0.         1.98019867 1.96039735 1.90331502 1.81546888 1.70634771 0.      ]      

                [0.         2.         1.98019867 1.92311635 0.         1.72614904 0.      ]

                [0.         1.98019867 1.96039735 1.90331502 0.         0.         0.      ]

                [0.         1.92311635 0.         1.84623269 1.75838656 1.64926538 0.      ]

                [0.         1.83527021 0.        1.75838656 1.67054042 0.          0.      ]

                [0.         0.         0.         0.         0.         0.         0.      ]]
 

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

1. A[index[:,0], index[:,1]] = 0

Ответ №1:

Вы можете использовать очень краткие обозначения, например arr[ind] , если у вас есть ind кортеж, содержащий индексы последовательных «нужных» элементов вдоль последовательных осей.

Чтобы сгенерировать такой кортеж из вашего списка индексов, вы можете запустить:

 ind = tuple(np.array(index).T)
 

В результате получается:

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

Затем, чтобы поставить 0 в нужных местах, запустите:

 arr[ind] = 0
 

Для некоторого случайного исходного массива (с нулями по всем краям), такого как ваш
образец исходных данных, я получил:

 array([[0.    , 0.    , 0.    , 0.    , 0.    , 0.    , 0.    ],
       [0.    , 1.5488, 0.    , 1.6028, 1.5449, 1.4237, 0.    ],
       [0.    , 1.6459, 1.4376, 1.8918, 0.    , 1.3834, 0.    ],
       [0.    , 1.7917, 1.5289, 1.568 , 0.    , 0.    , 0.    ],
       [0.    , 1.0871, 0.    , 1.8326, 1.7782, 1.87  , 0.    ],
       [0.    , 1.9786, 0.    , 1.4615, 1.7805, 0.    , 0.    ],
       [0.    , 0.    , 0.    , 0.    , 0.    , 0.    , 0.    ]])
 

Значения каждого ненулевого элемента не важны.
Обратите внимание только на то, что ваши «нужные» элементы были установлены в 0.