我正在尝试使用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]
and train_data是一个数组,其中包含图像像素和标签的元组
有人可以帮我吗?
答案 0 :(得分: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)-但我们将最后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]行如何分成两行。
重新分配尺寸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, ...])
答案 1 :(得分:0)
您拥有的代码没有执行您认为的操作。 i[0]
在第一个轴上获得第0个元素,即您的80
,这不是您想要的。
无论如何,您真正要选择的是沿最快方向选择第一个切片,所以要做:
X = train[:,:,:,0:1]
如果您的数据实际上不是您所说的大小,请尝试:
X = np.array([i.reshape(80, 60, 4)[:,:,0:1] for i in train])
答案 2 :(得分:0)
重塑形状为(7231,80,60,4)
-> (-1,80,60,1)
的数组可以“正常工作”:
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)
还是它指向了代码中的另一行?