numpy переупорядочивание при смешении целых чисел и индексов списка [дубликат]

Вот решение StreamEx

StreamEx.of(choices).toMap(Choice::getName, c -> c);

1
задан Will Martin 29 March 2016 в 07:34
поделиться

3 ответа

Похоже, есть некоторые ошибки при копировании вашего кода на вопрос.

Но я подозреваю, что есть известная проблема с индексированием:

In [73]: a=np.zeros((2,3,4)); b=np.ones((3,4)); I=np.array([0,1])

Сделайте I 2 элемента. Индексирование b дает ожидаемую форму (3,2). 3 строки из среза, 2 столбца из I индексирования

In [74]: b[:,I].shape
Out[74]: (3, 2)

Но с 3d a мы получаем транспонирование.

In [75]: a[0,:,I].shape
Out[75]: (2, 3)

и присвоение приведет к ошибке

In [76]: b[:,I]=a[0,:,I]
...
ValueError: array is not broadcastable to correct shape

Сначала помещается 2-элементный размер, определенный с помощью I, и 3 элемента из : в секунду. Это случай смешанной передовой индексации, о которой говорилось ранее, и есть проблема с ошибкой.

Вероятно, вы используете новый numpy (или scipy) и получаете другое сообщение об ошибке.

индексирование с двумя массивами или списками и срез в середине, помещает срез в конец, например

In [86]: a[[[0],[0],[1],[1]],:,[0,1]].shape
Out[86]: (4, 2, 3)

То же самое происходит с a[0,:,[0,1]]. Но есть хороший аргумент, что это не должно быть так.

Что касается исправления, вы можете перенести значение или изменить индексирование

In [88]: b[:,I]=a[0:1,:,I]

In [90]: b[:,I]=a[0,:,I].T

In [91]: b
Out[91]: 
array([[ 0.,  0.,  1.,  1.],
       [ 0.,  0.,  1.,  1.],
       [ 0.,  0.,  1.,  1.]])

In [92]: b[:,I]=a[0][:,I]

https : //github.com/numpy/numpy/issues/7030

https://github.com/numpy/numpy/pull/6256

1
ответ дан hpaulj 20 August 2018 в 15:34
поделиться
  • 1
    Спасибо, что очень полезно знать. , , срезы в середине индексных списков попадают в последнее измерение. – Will Martin 24 March 2016 в 20:22

Здесь я получаю эту ошибку с индексами [0,1,4]:

IndexError: index 4 is out of bounds for axis 2 with size 4

. Предполагая, что значение 4 используется как индекс, в то время как SIZE 4 подразумевает, что максимальный индекс будет равен 3.

EDIT: теперь, когда вы изменили его на [0, 1, 3], он работает отлично.

EDIT: с вашим текущим кодом я получаю ту же ошибку, но когда я печатаю массивы они имеют поперечную форму:

print b[:, I]
print a[0, :, I]

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

[[ 0.  0.  0.  0.]
 [ 0.  0.  0.  0.]
 [ 0.  0.  0.  0.]]
1
ответ дан heltonbiker 20 August 2018 в 15:34
поделиться

Прежде всего, похоже, что вы пропустили запятую в строке 6:

I = sp.array([0,1,4])

Во-вторых, я ожидал бы, что значение 4 в массиве I поднимет IndexError, так как оба и b имеет максимальный размер 4. Я подозреваю, что вам может понадобиться:

I = sp.array([0,1,3])

Выполнение этих изменений запускает программу для меня, и я получил b как:

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

Я подозреваю, что вы хотите.

1
ответ дан thecardkid 20 August 2018 в 15:34
поделиться
  • 1
    Спасибо, я только заметил, что этот тестовый пример действительно работает, поэтому я изменил этот пример. По некоторым причинам меньшие размеры массива не вызвали ошибку, которую я испытываю. – Will Martin 24 March 2016 в 20:03
Другие вопросы по тегам:

Похожие вопросы: