Numpy: ошибка несоответствия формы при помещении 3d-матрицы в 4d-матрицу с использованием индексации логического массива- python - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть ошибка в моем коде, и я воссоздал ее, используя простейший пример:

import numpy as np

zeros_4d = np.zeros((5,10,15,1))
zeros_3d = np.zeros((10,15,1))
ones_3d = zeros_3d + 1

bool_array = np.arange(0,15,1)>8

zeros_3d[:,9:,:] = ones_3d[:,9:,:] # This works fine
zeros_3d[:,bool_array,:] = ones_3d[:,bool_array,:] # This works fine

zeros_4d[0,:,9:,:] = ones_3d[:,9:,:] # This works fine

for i in np.arange(0,5,1):
    zeros_4d[0,i,bool_array,:] =  ones_3d[i,bool_array,:] # This works fine and does what I want

zeros_4d[0,:,bool_array,:] = ones_3d[:,bool_array,:] # This does not work

Я получаю это сообщение об ошибке: 'ValueError: несоответствие формы: массив значений формы (10,6, 2) не удалось передать результат индексации по форме (6,10,2) '

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

1 Ответ

0 голосов
/ 21 апреля 2020

То, что индексирование zeros_4d[0,:,bool_array,:] представляет собой смесь базовых c и продвинутых, с ломтиком в середине. Это специальный документированный случай, docs.scipy.org/doc/numpy/reference/…. Все размеры среза сдвинуты до конца, после логического индекса.

То есть с вашей 4d-формой и смешанным индексом:

In [213]: arr = np.ones((5,10,15,2),int)                                                               
In [214]: arr[0,:, [1,2,3],:].shape                                                                    
Out[214]: (3, 10, 2)

Сначала мы можем обойти эту проблему выбор начального измерения:

In [216]: arr[0][:, [1,2,3],:].shape                                                                   
Out[216]: (10, 3, 2)

In [217]: arr[0][:, [1,2,3],:] = 2                                                                     
In [218]: arr                                                                                          
Out[218]: 
array([[[[1, 1],
         [2, 2],
         [2, 2],
         ...,
         [1, 1],
         [1, 1],
         [1, 1]],
        ...

Разделение индекса во время назначения может быть проблемой, если первый первый индекс создает копию, а не представление. Но здесь arr[0] это вид, так что все в порядке.

...