无法将大小数组重塑为形状

Var*_*mar 9 numpy python-2.x python-3.x

我正在观看 YouTube 上的机器学习视频:https://www.youtube.com/watch?v =lbFEZAXzk0g 。该教程是python2的,所以我需要将其转换为python3。这是我遇到错误的代码部分:

def load_mnist_images(filename):
    if not os.path.exists(filename):
        download(filename)
    with gzip.open(filename,'rb') as file:
        data = numpy.frombuffer(file.read(),numpy.uint8, offset=16)
        data = data.reshape(-1,1,28,28)
        return data/numpy.float32(256)
Run Code Online (Sandbox Code Playgroud)

我收到此错误: ValueError: cannot reshape array of size 9992 into shape (1,28,28).如何解决此问题?在教程中它正在工作。另外,如果我有任何其他错误,请告诉我。

Der*_*ekG 9

您的输入与输出数组的元素数量不同。您的输入大小为 9992。您的输出大小为 [? x 1 x 28 x 28],因为 -1 表示 reshape 命令应确定沿此维度需要多少个索引才能适合您的数组。28x28x1 是 784,因此您想要重塑为该大小的任何输入都必须能够被 784 整除,以便它适合输出形状。9992 不能被 784 整除,因此它会抛出 ValueError。这是一个最小的例子来说明:

import numpy as np

data = np.zeros(2352) # 2352 is 784 x 3
out = data.reshape((-1,1,28,28)) # executes correctly -  out is size [3,1,28,28]

data = np.zeros(9992) # 9992 is 784 x 12.745 ... not integer divisible
out = data.reshape((-1,1,28,28)) # throws ValueError: cannot reshape array of size 9992 into shape (1,28,28)
Run Code Online (Sandbox Code Playgroud)

因此,如果您不想要 ValueError,则需要将输入重新调整为正确大小的不同大小的数组。


小智 2

重塑具有以下语法

data.reshape(shape)
Run Code Online (Sandbox Code Playgroud)

形状以元组 (a, b) 的形式传递。所以尝试一下

data.reshape((-1, 1, 28, 28))
Run Code Online (Sandbox Code Playgroud)

  • 它仍然给出错误。有人可以编辑这篇文章吗? (2认同)