Numpy изменить несколько значений 2D-массив с помощью нарезки - PullRequest
0 голосов
/ 14 января 2019

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

Вот пример кода:

import numpy as np

a = np.array([
    [0, 0, 1, 0, 0],
    [1, 1, 1, 0, 1],
    [0, 1, 0, 1, 0],
    [1, 1, 1, 0, 0],
    [1, 0, 0, 0, 1],
    [0, 0, 0, 0, 0],
])

b = np.ones(a.shape)    # Fill with ones
rows = a[:, 3] == 0     # Select all the rows where the value at the 4th column equals 0
cols = [2, 3, 4]        # Select the columns 2, 3 and 4

b[rows, cols] = 2       # Replace the values with 2
print(b)

Результат, который я хочу получить в b:

[[1. 1. 2. 2. 2.]
 [1. 1. 2. 2. 2.]
 [1. 1. 1. 1. 1.]
 [1. 1. 2. 2. 2.]
 [1. 1. 2. 2. 2.]
 [1. 1. 2. 2. 2.]]

Но единственное, что я получаю, это исключение:

IndexError
shape mismatch: indexing arrays could not be broadcast together with shapes (5,) (3,)

Как мне достичь желаемого результата?

1 Ответ

0 голосов
/ 14 января 2019

Вы можете использовать argwhere :

rows = np.argwhere(a[:, 3] == 0)    
cols = [2, 3, 4]        

b[rows, cols] = 2       # Replace the values with 2
print(b)

выход

[[1. 1. 2. 2. 2.]
 [1. 1. 2. 2. 2.]
 [1. 1. 1. 1. 1.]
 [1. 1. 2. 2. 2.]
 [1. 1. 2. 2. 2.]
 [1. 1. 2. 2. 2.]]
...