numpy reshape中的-1是什么意思?

时间:2017-01-21 06:56:13

标签: python numpy machine-learning

 I have a numpy array (A) of shape = (100000, 28, 28)
 I reshape it using A.reshape(-1, 28x28)

这在机器学习管道中非常常见。 这是如何运作的 ?我从来没有理解重塑中“-1”的含义。

一个确切的问题是this 但没有可靠的解释。有什么答案吗?

2 个答案:

答案 0 :(得分:14)

在numpy中,创建一个100X100项的矩阵是这样的:

import numpy as np
x = np.ndarray((100, 100))
x.shape  # outputs: (100, 100)

numpy内部将所有10000个项目存储在10000个项目的数组中,无论此对象的形状如何,这允许我们将此数组的形状更改为任何维度,只要数组上的项目数量不会改变

例如,将我们的对象重塑为10X1000是正常的,因为我们保留了10000个项目:

x = x.reshape((10, 1000))

重塑到10X2000不会工作,因为我们在列表中没有足够的项目

x.reshape((10, 2000))
ValueError: total size of new array must be unchanged

回到-1问题,它的作用是未知维度的符号,意思是: 让numpy用正确的值填充缺少的维度,这样我的数组就会保留相同数量的项目。

所以这个:

x = x.reshape((10, 1000))

相当于:

x = x.reshape((10, -1)) 

内部numpy所做的只是计算10000 / 10以获得缺失的维度。

-1甚至可以在数组的开头或中间。

以上两个例子相当于:

x = x.reshape((-1, 1000)) 

如果我们尝试将两个维度标记为未知,numpy将引发异常,因为它无法知道我们的含义,因为有多种方法可以重新整形数组。

x = x.reshape((-1, -1))
ValueError: can only specify one unknown dimension

答案 1 :(得分:11)

这意味着,推断了您通过-1的维度的大小。因此,

A.reshape(-1, 28*28)

表示“重塑A,以便其第二个维度的大小为28 * 28,并计算第一个维度的正确大小”。

See documentation of reshape