Заменить элементы 2D-массива нулями, используя индексный вектор столбца - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть двумерный массив A:

28  39  52
77  80  66   
 7  18  24    
 9  97  68

И векторный массив индексов столбцов B:

1   
0   
2    
0

Каким образом на Python, используя базовый python или numpy, можноЯ заменяю нулями элементы в каждой строке A, которые соответствуют индексам столбцов в B?

Я должен получить следующий новый массив A, с одним элементом в каждой строке (один в индексе столбца хранится вБ) заменено на ноль:

28   0  52
 0  80  66   
 7  18   0    
 0  97  68

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018
In [117]: A = np.array([[28,39,52],[77,80,66],[7,18,24],[9,97,68]])                                                     
In [118]: B = [1,0,2,0]                                                                                                 

Чтобы выбрать один элемент из каждой строки, нам нужно проиндексировать строки с помощью массива, который соответствует B:

In [120]: A[np.arange(4),B]                                                                                             
Out[120]: array([39, 77, 24,  9])

И мы можем установить те же элементы с помощью:

In [121]: A[np.arange(4),B] = 0                                                                                         
In [122]: A                                                                                                             
Out[122]: 
array([[28,  0, 52],
       [ 0, 80, 66],
       [ 7, 18,  0],
       [ 0, 97, 68]])

Это завершает индексацию точек с помощью индексов (0,1), (1,0), (2,2), (3,0).

Транспонирование на основе спискагенерирует одинаковые пары:

In [123]: list(zip(range(4),B))                                                                                         
Out[123]: [(0, 1), (1, 0), (2, 2), (3, 0)]
0 голосов
/ 30 сентября 2018

Вот простой питонский способ использования enumerate:

for i, j in enumerate(B):
    A[i][j] = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...