NumPy: индексирование одного элемента из двумерного массива - PullRequest
1 голос
/ 03 апреля 2020

У меня есть следующий массив 8 на 8 с именем arr:

[[False False False False False False False False]
 [False False False False False False False False]
 [False False False False False False False False]
 [False False False False False False False False]
 [False False False False False False False False]
 [False False False False False False False False]
 [False False False False False False False False]
 [False False False False False False False False]]

Я хочу установить его элементы c на True, для которого у меня есть этот массив filtered_ind :

[[5 6]
 [4 5]
 [2 5]
 [1 6]]

Попытка сделать это:

arr[filtered_ind] = True

Результат в следующем:

[[False False False False False False False False]
 [ True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True]
 [False False False False False False False  True]
 [ True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True]
 [False False False False False False False False]]

По сути, он принимает каждое число в массиве filtered_ind и устанавливает для этих строк значение True вместо установки указанных элементов c.

Я выяснил, что индексация работает не так, как я думаю, поскольку print(arr[filtered_ind]) дает мне следующее:

[[[False False False False False False False False]
  [False False False False False False False False]]

 [[False False False False False False False False]
  [False False False False False False False False]]

 [[False False False False False False False False]
  [False False False False False False False False]]

 [[False False False False False False False False]
  [False False False False False False False False]]]

вместо того, что я ожидаю, что будет, конечно, [False False False False].

Как мне это исправить, и, что более важно, почему это происходит?

Ответы [ 3 ]

5 голосов
/ 03 апреля 2020

Вы индексируете только по первой оси. Вам нужно:

a = np.full((8,8), False)
ix = np.array([[5, 6],[4, 5],[2, 5],[1, 6]])

a[ix[:,0], ix[:,1]] = True

Или мы могли бы также использовать np.add.at здесь:

np.add.at(a,tuple(zip(*ix)),True)

print(a)
[[False False False False False False False False]
 [False False False False False False  True False]
 [False False False False False  True False False]
 [False False False False False False False False]
 [False False False False False  True False False]
 [False False False False False False  True False]
 [False False False False False False False False]
 [False False False False False False False False]]

Имейте в виду, что индексируя, как вы , a[ix], вы индексируете только вдоль первой оси. Вы увидите более ясно на более простом примере:

ix = np.array([[1,2],[0,3],[2,2]])

a = np.arange(0,16).reshape(4,4)
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

Теперь, если вы индексируете вдоль первой оси, как вы делали, вы получите:

a[ix]

array([[[ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[ 0,  1,  2,  3],
        [12, 13, 14, 15]],

       [[ 8,  9, 10, 11],
        [ 8,  9, 10, 11]]])

В основном столько строк как значения в индексах, с формой индексного массива. Вы также должны указать , по каким столбцам (вторая ось) вы индексируете , как и в первом подходе, [ix[:,0] по первой оси и ix[:,1] по второй:

a[ix[:,0], ix[:,1]] = True
0 голосов
/ 03 апреля 2020

Вы также можете использовать np.fromfunction вместе с np.vectorize:

np.fromfunction(np.vectorize(lambda i, j: [i,j] in filter_ind.tolist()), (8,8))
0 голосов
/ 03 апреля 2020

При индексации, как вы хотите, вы должны указать кортеж индексов, а не массив индексов. Как это:

a = np.array([[1,2,3],
              [4,5,6],
              [7,8,9]])

ind = ([0,1],[1,2]) #this is a tuple of lists, not a list of lists
print(a[ind]) # [2,6]

a[ind] = 0 #Setting a[0,1] = 0 and a[1,2] = 0
print(a) 

a:
[[1 0 3]
 [4 5 0]
 [7 8 9]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...