首页 > 解决方案 > IndexError:范围对象索引超出范围错误

问题描述

嗨,我有以下代码用完索引。如何修复可以解决超出范围错误的矩阵的索引。

我试过修改过滤器范围。但这并不走运。

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.tile 的解决方案导致相同的错误

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)

标签: pythonmatlabnumpy

解决方案


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]

whereFilters是一个列表或对象 dtype 数组,可以保存各种项目的集合。项目[j](从 0 开始计数)必须是具有shape属性的数组。 np.size(Filters[j],2)也可以,但通常我们使用shape而不是size(使用轴参数)。

所以

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

获取一个MapInference矩阵,并复制它以制作一个(8,8,size(),BatchSize)成形矩阵(4d)。

numpy.matlab.repmat就像旧时代的 MATLAB repmat(v 3.5)。它适用于np.matrix2d 数组。

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.repeatornp.tile代替。


推荐阅读