numpy reshape 中的 -1 是啥意思? [复制]

Posted

技术标签:

【中文标题】numpy reshape 中的 -1 是啥意思? [复制]【英文标题】:What does -1 in numpy reshape mean? [duplicate]numpy reshape 中的 -1 是什么意思? [复制] 【发布时间】:2017-06-06 04:56:01 【问题描述】:
 I have a numpy array (A) of shape = (100000, 28, 28)
 I reshape it using A.reshape(-1, 28x28)

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

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

【问题讨论】:

查看文档:docs.scipy.org/doc/numpy/reference/generated/… - The new shape should be compatible with the original shape. If an integer, then the result will be a 1-D array of that length. One shape dimension can be -1. In this case, the value is inferred from the length of the array and remaining dimensions. 在您的示例中,生成的数组将具有形状 (100000, 784)。它是第一维的简写,因为只有一个值是正确的。 【参考方案1】:

在 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

【讨论】:

@MaxPowers :我可以说:您允许不指定重构数组的 1 个维度。您将 -1 用于“未指定”维度。在运行时,这是从重构数组的旧大小和其他维度推断出来的? numpy 只是为你计算它,而不是你明确地写它。不涉及运行时。是的,你说得对,它是从旧大小推断出来的 - reshape() 无法更改数组项的数量【参考方案2】:

这意味着正在推断您传递-1 的维度的大小。因此,

A.reshape(-1, 28*28)

意思是,“重塑A,使其第二个维度的大小为28*28,并计算出第一个维度的正确大小”。

See documentation of reshape.

【讨论】:

以上是关于numpy reshape 中的 -1 是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

利用Python中的numpy.ndarray.reshape()对阵列形状进行调整

数组在 numpy/sklearn 数据集中是啥意思? Python

matlab中reshape函数中把A中元素进行重塑成m×n×p×…的矩阵是啥意思

python 来自https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html#numpy.reshape的numpy

numpy的resize和reshape区别

就总数据而言,Numpy.Reshape() 在输入向量处理中做了啥