IndexError: ошибка индекса объекта диапазона вне диапазона - PullRequest
0 голосов
/ 11 июня 2019

Привет У меня есть следующий код, который выходит за пределы индекса.Как я могу исправить индексирование для матрицы, которая может решить ошибку вне диапазона.

Я попытался изменить диапазон фильтра.Но это не удача.

Filters = range(0,32)   
for j in MapSizes:
    if MapSizes[j] == 32:
         LayerMapInference[j] = repmat(np.array(MapInference, 8,8, len(Filters[j][3]),Batchsize))
    elif MapSizes[j] == 16:
         LayerMapInference[j] = repmat(np.array(MapInference, 4,4, len(Filters[j][3]),Batchsize))
    elif MapSizes[j] == 8:
         LayerMapInference[j] = repmat(np.array(MapInference, 2,2, len(Filters[j][3]),Batchsize))

Эквивалентный код Matlab:

if MapSizes(j) == 32
        LayerMapInference{j} = repmat(MapInference,8,8,size(Filters{j},3),BatchSize);
    elseif MapSizes(j) == 16
        LayerMapInference{j} = repmat(MapInference,4,4,size(Filters{j},3),BatchSize);
    elseif MapSizes(j) == 8
        LayerMapInference{j} = repmat(MapInference,2,2,size(Filters{j},3),BatchSize);
    end

Пожалуйста, дайте мне знать, как я могу исправить эту ошибку.

Решение с помощью np.тайл, приводящий к той же ошибке

for j in MapSizes:

        if MapSizes[j] == 32:
                 LayerMapInference[j] = np.tile(MapInference, 8,8, Filters[j].shape[2],Batchsize)
        elif MapSizes[j] == 16:
                 LayerMapInference[j] = np.tile(MapInference, 4,4, Filters[j].shape[2],Batchsize)
        elif MapSizes[j] == 8:
                 LayerMapInference[j] = np.tile(MapInference, 2,2, Filters[j].shape[2],Batchsize)

1 Ответ

0 голосов
/ 11 июня 2019

range(0,32) в Python похож на 0:31 в MATLAB, за исключением того, что он не обрабатывается до использования (как в цикле for или list(range(0,32))).

Если правильно вызвать MATLAB, LayerMapInference{j} должно быть cell с индексированием {} (в отличие от () индексирования матрицы).

Я читаю size(Filters{j},3) как:

 Filters{j}     # the jth item in the Filters cell
 size(...,3)    # the 3rd dimension of that object (a 3d matrix?)

В numpy это было бы примерно

 Filters[j].shape[2]

где Filters - массив dtype списка или объекта, который может содержать разнообразную коллекцию элементов. Элемент [j] (считая от 0) должен быть массивом с атрибутом shape. np.size(Filters[j],2) также будет работать, но обычно мы используем shape вместо size (с параметром axis).

So

repmat(MapInference,8,8,size(Filters{j},3),BatchSize)

принимает матрицу MapInference и копирует ее для получения матрицы (8,8,size(),BatchSize) (4d).

numpy.matlab.repmat похоже на старое время MATLAB repmat (v 3.5). Он предназначен для работы с np.matrix, который является двумерным массивом.

In [659]: repmat(np.arange(4),3,2)                                                                     
Out[659]: 
array([[0, 1, 2, 3, 0, 1, 2, 3],
       [0, 1, 2, 3, 0, 1, 2, 3],
       [0, 1, 2, 3, 0, 1, 2, 3]])
In [660]: repmat(np.arange(4),3,2,3)                                                                   
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-660-c5acb9021d92> in <module>
----> 1 repmat(np.arange(4),3,2,3)

TypeError: repmat() takes 3 positional arguments but 4 were given

Поэтому используйте np.repeat или np.tile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...