首页 文章

使用Numpy.Reshape重塑阵列

提问于
浏览
0

我试图使用numpy.reshape重塑数组,但总是遇到索引错误

"IndexError: index 15484 is out of bounds for axis 0 with size 7231"

然后我打印出阵列的形状

(7231,80,60,4)

我的代码是

X = np.array([i[0] for i in train]).reshape(-1,80,60,1)

(我试图将我的所有图像重塑为(-1,80,60,1))

我认为-1自动填充尺寸,所以我很困惑为什么我收到这个错误?

火车是:

train = train_data[:-500]

和train_data是一个包含图像像素和标签元组的数组

有人能帮我吗?

3 回答

  • 0

    你拥有的代码没有按照你的想法去做 . i[0] 获取第一个轴中的第0个元素,即 80 ,这不是您想要的 .

    无论如何,你真正想要的是选择最快方向的第一片,所以这样做:

    X = train[:,:,:,0:1]
    

    如果您的数据实际上不是您所说的大小,请尝试:

    X = np.array([i.reshape(80, 60, 4)[:,:,0:1] for i in train])
    
  • 0

    重塑形状数组 (7231,80,60,4) - > (-1,80,60,1) 确实"just work":

    train = np.arange(np.prod((7231,80,60,4))).reshape(7231,80,60,4)
    print(train.shape)
    
    X = train.reshape(-1,80,60,1)
    print(X.shape)
    

    输出:

    (7231, 80, 60, 4)
    (28924, 80, 60, 1)
    

    所以你要重新尝试的问题 . 我的猜测是你的问题可能与 train_data 数组的形式/内容有关(或者你试图用 np.array([i[0] for i in train]) 从它创建的数组) . 当然,问题也可能出在您未在问题中发布的代码部分 . 如果您发布了更多的实际代码,那可能会有所帮助 .

    特别是,当您收到错误消息时:

    IndexError: index 15484 is out of bounds for axis 0 with size 7231
    

    它应该包含一个堆栈跟踪,它直接指向代码中有问题的行 . 堆栈跟踪是否表示从您创建 X 的行中引发了错误:

    X = np.array([i[0] for i in train]).reshape(-1,80,60,1)
    

    或者它是否指向代码中的不同行?

  • 1

    重塑时要小心 . 即使它有效,元素的排列可能也不是你想要的 .

    从一个我们可以想象的简单数组开始:

    In [805]: x = np.arange(24).reshape(3,2,4)
    In [806]: x
    Out[806]: 
    array([[[ 0,  1,  2,  3],
            [ 4,  5,  6,  7]],
    
           [[ 8,  9, 10, 11],
            [12, 13, 14, 15]],
    
           [[16, 17, 18, 19],
            [20, 21, 22, 23]]])
    

    重塑为(-1,2,1) - 但让我们删除最后一个以获得更紧凑的显示:

    In [807]: x.reshape(-1,2)
    Out[807]: 
    array([[ 0,  1],
           [ 2,  3],
           [ 4,  5],
           [ 6,  7],
           [ 8,  9],
           [10, 11],
           [12, 13],
           [14, 15],
           [16, 17],
           [18, 19],
           [20, 21],
           [22, 23]])
    

    注意原始[0,1,2,3]行如何分成2行 .

    重新分配大小4的最后一个维度的另一种方法是:

    In [808]: np.vstack([x[...,i] for i in range(4)])
    Out[808]: 
    array([[ 0,  4],
           [ 8, 12],
           [16, 20],
           [ 1,  5],
           [ 9, 13],
           [17, 21],
           [ 2,  6],
           [10, 14],
           [18, 22],
           [ 3,  7],
           [11, 15],
           [19, 23]])
    

    如果我们使用 np.stack 并获得(4,3,2)形状,那可能会更清楚

    array([[[ 0,  4],
            [ 8, 12],
            [16, 20]],
      ....
    

    x.transpose(2,0,1) 产生同样的事情 .

    reshape 保留了元素的散乱/扁平顺序 . 转置会改变它 .

    In [812]: x.transpose(2,0,1).ravel()
    Out[812]: 
    array([ 0,  4,  8, 12, 16, 20,  1,  5,  9, 13, 17, 21,  2,  6, 10, 14,...])
    In [813]: x.reshape(-2,2).ravel()
    Out[813]: 
    array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, ...])
    

相关问题