首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Numpy.Reshape重塑数组

使用Numpy.Reshape重塑数组
EN

Stack Overflow用户
提问于 2018-12-10 04:42:38
回答 3查看 676关注 0票数 0

我正在尝试使用numpy.reshape对数组进行整形,但总是遇到索引错误

代码语言:javascript
复制
"IndexError: index 15484 is out of bounds for axis 0 with size 7231"

然后我打印出了数组的形状

代码语言:javascript
复制
(7231,80,60,4)

我的代码是

代码语言:javascript
复制
X = np.array([i[0] for i in train]).reshape(-1,80,60,1)

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

我认为-1会自动完成尺寸,所以我很困惑为什么我会得到这个错误?

列车是:

代码语言:javascript
复制
    train = train_data[:-500]

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

有人能帮我吗?

EN

回答 3

Stack Overflow用户

发布于 2018-12-10 09:18:10

重塑形状时要小心。即使它可以工作,元素的排列也可能不是您想要的。

从一个我们可以可视化的简单数组开始:

代码语言:javascript
复制
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) -但为了更紧凑的显示,让我们去掉最后一个1:

代码语言:javascript
复制
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行是如何被分成两行的。

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

代码语言:javascript
复制
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和got (4,3,2)形状,这可能会更清楚

代码语言:javascript
复制
array([[[ 0,  4],
        [ 8, 12],
        [16, 20]],
  ....

x.transpose(2,0,1)会产生同样的结果。

reshape保留元素的拼合/展平顺序。转置改变了它。

代码语言:javascript
复制
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, ...])
票数 2
EN

Stack Overflow用户

发布于 2018-12-10 04:55:52

您拥有的代码并不像您所认为的那样工作。i[0]获取第一个轴中的第0个元素,这是您的80,这不是您想要的。

无论如何,你真正要做的就是在最快的方向上选择第一个切片,所以只需这样做:

代码语言:javascript
复制
X = train[:,:,:,0:1]

如果你的数据并不像你说的那样大,那就试试吧:

代码语言:javascript
复制
X = np.array([i.reshape(80, 60, 4)[:,:,0:1] for i in train])
票数 0
EN

Stack Overflow用户

发布于 2018-12-10 05:20:03

重塑一个形状数组(7231,80,60,4) -> (-1,80,60,1)确实“很管用”:

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
(7231, 80, 60, 4)
(28924, 80, 60, 1)

因此,你遇到的问题不能直接源于你正在尝试进行的重塑。我猜测您的问题可能与您的train_data数组(或您试图用np.array([i[0] for i in train])从它创建的数组)的形式/内容有关。当然,问题也可能出现在您的代码中没有在问题中发布的部分。如果您多发布一些实际代码,可能会有所帮助。

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

代码语言:javascript
复制
IndexError: index 15484 is out of bounds for axis 0 with size 7231

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

代码语言:javascript
复制
X = np.array([i[0] for i in train]).reshape(-1,80,60,1)

或者它是否指向代码中的另一行?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53696497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档