numpy reshape 混淆与负形状值

Posted

技术标签:

【中文标题】numpy reshape 混淆与负形状值【英文标题】:numpy reshape confusion with negative shape values 【发布时间】:2016-12-28 12:55:21 【问题描述】:

总是对 numpy reshape 如何处理负形状参数感到困惑,这是代码和输出的示例,有人能解释一下 reshape [-1, 1] 会发生什么吗?谢谢。

相关文档,使用 Python 2.7。

http://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder

S = np.array(['box','apple','car'])
le = LabelEncoder()
S = le.fit_transform(S)
print(S)
ohe = OneHotEncoder()
one_hot = ohe.fit_transform(S.reshape(-1,1)).toarray()
print(one_hot)

[1 0 2]
[[ 0.  1.  0.]
 [ 1.  0.  0.]
 [ 0.  0.  1.]]

【问题讨论】:

这能回答你的问题吗? What does -1 mean in numpy reshape? 【参考方案1】:

来自reshape docs:

一个形状维度可以是-1。在这种情况下,推断值 从数组的长度和剩余的维度。

在您的情况下,它用于将 (3,) S 转换为 (3,1) 数组的常见任务。我认为在这种特殊情况下使用S[:, None] 会产生相同的效果。

【讨论】:

谢谢 Aguy,当您说 (3,) 时,语法有点困惑,, 在这里是什么意思? 只是为了设计一个元组。 (3)3(3,) 是具有单个元素 3 的元组。 (形状是元组,即使它们只包含一个元素) 您可以将(n,) numpy 对象视为一个向量,而将(n,1) 视为只有一列的矩阵。 感谢 Aguy,但如果 (3,) 仅表示元组中的一个元素,您将如何将其转换为 (3,1) 的形状?我认为(3,1) 表示 3 行 * 1 列,即 3 个元素? @JulienBernu,但是如果(3,) 仅表示元组中的一个元素,您将如何将其转换为(3,1) 的形状?我认为(3,1) 表示 3 行 * 1 列,即 3 个元素?【参考方案2】:

-1 用于推断另一个缺失的长度。例如,将(3,4,5) 整形为(-1,10) 等效于整形为(6,10),因为6 是唯一对其他输入有意义的长度。

【讨论】:

谢谢 Julien,在你的例子中,它是 3 维数组 3*4*5?那么,如果在 reshape 之后我们需要将列数设为 10,行数必须为 6,这是正确的计算吗?谢谢。 是:输入数组有3*4*5 = 60 元素。输出将包含n_rows * 10 元素,因此我们需要求解n_rows * 10 = 60 得到n_rows = 6 谢谢 Julien,但是如果多个 -1 他们如何处理? 它不能因为它是模棱两可的,如文档中所述,或者如果你尝试抛出的错误...... 感谢 Julien 的帮助,将您的回复标记为答案。 :)

以上是关于numpy reshape 混淆与负形状值的主要内容,如果未能解决你的问题,请参考以下文章

python基础之numpy.reshape详解

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

numpy:数组的形状与展开

numpy.reshape()使用方法

通过python进行LSTM编程

Numpy学习三:数组运算