2017-02-22 4 views
2
import numpy as np 
a = np.zeros((10,20,30)) 

Для извлечения элементов второго и третьего измерения, ind1 и ind2 являются список индексовNumpy массив многомерное индексирование со списком IndexError: несоответствие формы

ind1 = [0,5,6] 
ind2 = [1,2,7,8] 
a[:,ind1,ind2] 

Над команды дает IndexError: несоответствие формы

Если мы делаем индексацию следующим

a1 = a[:,ind1,:] 
a2 = a1[:,:,ind2] 

это работает, и если ди значения индексов ind1 и ind2 одинаковы, тогда работает индексация.

Нужно ли, чтобы списки индексов были одинаковой формы для многомерного массива?

ответ

1

Поскольку форма вывода определяется формой массива индексирования, да, они должны быть одинаковыми.

Или скорее совместимы следующие

i1, i2 = np.ix_(ind1, ind2) 
a[:, i1, i2] 

будет работать. Он создает массив 10x3x4, выбирая все комбинации ind1, ind2 (i1, i2 - это форма (3, 1) (1, 4), поэтому они транслируются вместе).

«Обычное» поведение (когда ind1 и ind2 не транслируются), напротив, нужно только выбрать соответствующие элементы ind1 и ind2, поэтому их формы должны совпадать.

Вот простой пример, чтобы показать разницу

>>> z = np.zeros((5,5), int) 
>>> a = [1,2,4] 
>>> z[a,a] = 1 
>>> z # 3 points set 
array([[0, 0, 0, 0, 0], 
     [0, 1, 0, 0, 0], 
     [0, 0, 1, 0, 0], 
     [0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 1]]) 
>>> a1,a2 = np.ix_(a,a) 
>>> z[a1,a2] = 1 
>>> z # 3x3 points set 
array([[0, 0, 0, 0, 0], 
     [0, 1, 1, 0, 1], 
     [0, 1, 1, 0, 1], 
     [0, 0, 0, 0, 0], 
     [0, 1, 1, 0, 1]]) 
1

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

a[:,ind1,:][:,:,ind2] 

Он не получает ошибку индекса

+0

Хороший трюк. Должен выдавать тот же результат, что и метод 'np.ix_'. Конечно, 'np.ix_' обычно будет более эффективным, но ваш тип меньше. –

+0

@PaulPanzer Да, я бы ожидал, что ваше решение - это метод, предпочитаемый создателями numpy: p – Harlekuin

Смежные вопросы