【问题标题】:IndexError: range object index out of range errorIndexError:范围对象索引超出范围错误
【发布时间】:2019-06-11 13:29:20
【问题描述】:

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

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

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)

【问题讨论】:

  • Filters[j][3] 不起作用,因为它是一维列表。你需要Filters[j] 没有[3]
  • @Sheldore 是的,您可以索引范围对象。
  • @Selcuk :在这种情况下,错误很明显,它来自一维列表的双索引
  • 你能解释一下你想做什么吗?
  • 什么是MapSizesnp.array(MapInference, 8,8, len(Filters[j][3]) 应该做什么? np.array 的第二个参数应该是 dtype,而不是像 8 这样的数字。 repmat 是什么?

标签: python matlab numpy


【解决方案1】:

Python 中的range(0,32) 与 MATLAB 中的 0:31 类似,不同之处在于它在使用之前不会被评估(如在 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(带有轴参数)。

所以

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.repeatnp.tile

【讨论】:

  • 我很清楚地理解了 matlab repmat 函数和 python tile 之间的区别,形成了你的解释。读取 size(Filters{j},3) 的方式已经解释清楚。但不幸的是,即使在按照您的解释实现代码之后仍然给我同样的错误。我已经相应地编辑了我的解决方案。
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 2019-11-25
相关资源
最近更新 更多