587

A numpy matrix can be reshaped into a vector using reshape function with parameter -1. But I don't know what -1 means here.

For example:

a = numpy.matrix([[1, 2, 3, 4], [5, 6, 7, 8]])
b = numpy.reshape(a, -1)

The result of b is: matrix([[1, 2, 3, 4, 5, 6, 7, 8]])

Does anyone know what -1 means here? And it seems python assign -1 several meanings, such as: array[-1] means the last element. Can you give an explanation?

4

11 回答 11

781

提供新形状要满足的标准是“新形状应该与原始形状兼容”

numpy 允许我们将新的形状参数之一指定为 -1(例如:(2,-1) 或 (-1,3) 但不是 (-1, -1))。它只是意味着它是一个未知维度,我们希望 numpy 弄清楚它。numpy 将通过查看 “数组的长度和剩余维度”并确保它满足上述标准来计算这一点

现在看例子。

z = np.array([[1, 2, 3, 4],
         [5, 6, 7, 8],
         [9, 10, 11, 12]])
z.shape
(3, 4)

现在尝试用 (-1) 重塑。结果新形状为 (12,) 并且与原始形状 (3,4) 兼容

z.reshape(-1)
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

现在尝试用 (-1, 1) 重塑。我们提供 column 为 1 但 rows 为 unknown 。所以我们得到结果新形状为 (12, 1)。再次与原始形状兼容 (3,4)

z.reshape(-1,1)
array([[ 1],
   [ 2],
   [ 3],
   [ 4],
   [ 5],
   [ 6],
   [ 7],
   [ 8],
   [ 9],
   [10],
   [11],
   [12]])

以上与numpy建议/错误消息一致,reshape(-1,1)用于单个功能;即单列

array.reshape(-1, 1)如果您的数据具有单一特征,则使用重塑您的数据

新形状为 (-1, 2)。行未知,第 2 列。我们得到的结果新形状为 (6, 2)

z.reshape(-1, 2)
array([[ 1,  2],
   [ 3,  4],
   [ 5,  6],
   [ 7,  8],
   [ 9, 10],
   [11, 12]])

现在试图将列保持为未知。新形状为 (1,-1)。即,行为 1,列未知。我们得到结果新形状为 (1, 12)

z.reshape(1,-1)
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]])

以上与numpy建议/错误信息一致,reshape(1,-1)用于单个样本;即单行

array.reshape(1, -1)如果数据包含单个样本,则使用它来重塑您的数据

新形状 (2, -1)。第 2 行,列未知。我们得到结果新形状为(2,6)

z.reshape(2, -1)
array([[ 1,  2,  3,  4,  5,  6],
   [ 7,  8,  9, 10, 11, 12]])

新形状为 (3, -1)。第 3 行,列未知。我们得到结果新形状为(3,4)

z.reshape(3, -1)
array([[ 1,  2,  3,  4],
   [ 5,  6,  7,  8],
   [ 9, 10, 11, 12]])

最后,如果我们尝试提供未知的两个维度,即新形状为 (-1,-1)。它会抛出一个错误

z.reshape(-1, -1)
ValueError: can only specify one unknown dimension
于 2017-02-28T13:48:51.950 回答
100

用于重塑数组。

假设我们有一个维度为 2 x 10 x 10 的 3 维数组:

r = numpy.random.rand(2, 10, 10) 

现在我们要重塑为 5 X 5 x 8:

numpy.reshape(r, shape=(5, 5, 8)) 

将完成这项工作。

请注意,一旦您修复了 firstdim = 5和 second dim = 5,您就不需要确定第三个维度。为了缓解你的懒惰,Numpy 提供了使用的选项-1

numpy.reshape(r, shape=(5, 5, -1)) 

会给你一个数组shape = (5, 5, 8)

同样地,

numpy.reshape(r, shape=(50, -1)) 

会给你一个 shape = (50, 4) 的数组

您可以在http://anie.me/numpy-reshape-transpose-theano-dimshuffle/阅读更多内容

于 2017-03-22T11:35:35.177 回答
67

根据the documentation

newshape : 整数或整数元组

新形状应与原始形状兼容。如果是整数,则结果将是该长度的一维数组。一个形状维度可以是-1。在这种情况下,该值是从数组的长度和剩余维度推断出来的。

于 2013-09-09T03:27:07.000 回答
21
numpy.reshape(a,newshape,order{})

检查以下链接以获取更多信息。 https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

对于您提到的以下示例,输出将结果向量解释为单行。(-1)表示行数为 1。如果

a = numpy.matrix([[1, 2, 3, 4], [5, 6, 7, 8]])
b = numpy.reshape(a, -1)

输出:

matrix([[1, 2, 3, 4, 5, 6, 7, 8]])

这可以用另一个例子更准确地解释:

b = np.arange(10).reshape((-1,1))

输出:(是一维柱状数组)

array([[0],
       [1],
       [2],
       [3],
       [4],
       [5],
       [6],
       [7],
       [8],
       [9]])

或者

b = np.arange(10).reshape((1,-1))

输出:(是一维行数组)

array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
于 2017-01-02T16:41:36.430 回答
17

这只是意味着您不确定可以提供多少行或列数,并且您要求 numpy 建议要重新调整的列数或行数。

numpy 提供了 -1 的最后一个示例 https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

检查下面的代码及其输出以更好地理解(-1):

代码:-

import numpy
a = numpy.matrix([[1, 2, 3, 4], [5, 6, 7, 8]])
print("Without reshaping  -> ")
print(a)
b = numpy.reshape(a, -1)
print("HERE We don't know about what number we should give to row/col")
print("Reshaping as (a,-1)")
print(b)
c = numpy.reshape(a, (-1,2))
print("HERE We just know about number of columns")
print("Reshaping as (a,(-1,2))")
print(c)
d = numpy.reshape(a, (2,-1))
print("HERE We just know about number of rows")
print("Reshaping as (a,(2,-1))")
print(d)

输出:-

Without reshaping  -> 
[[1 2 3 4]
 [5 6 7 8]]
HERE We don`t know about what number we should give to row/col
Reshaping as (a,-1)
[[1 2 3 4 5 6 7 8]]
HERE We just know about number of columns
Reshaping as (a,(-1,2))
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
HERE We just know about number of rows
Reshaping as (a,(2,-1))
[[1 2 3 4]
 [5 6 7 8]]
于 2019-11-27T13:12:03.430 回答
17

代表“-1未知维度”,可以从另一个维度推断。在这种情况下,如果您像这样设置矩阵:

a = numpy.matrix([[1, 2, 3, 4], [5, 6, 7, 8]])

像这样修改你的矩阵:

b = numpy.reshape(a, -1)

它将调用矩阵的一些默认操作a,这将返回一个一维numpy数组/矩阵。

但是,我认为使用这样的代码不是一个好主意。为什么不试试:

b = a.reshape(1, -1)

它将给您相同的结果,并且读者更容易理解:设置ba. 对于a,我们不知道它应该有多少列(将其设置为 -1!),但我们想要一个一维数组(将第一个参数设置为 1!)。

于 2017-02-27T01:56:58.540 回答
16

转换的最终结果是最终数组中的元素个数与初始数组或数据帧的元素个数相同。

-1 对应于行或列的未知计数。我们可以将其视为x(未知)。x是通过将原始数组中的元素数除以有序对的另一个值与 -1 获得的。

例子:

12 个元素reshape(-1,1)对应于x=12/1=12 行和 1 列的数组。


12 个元素reshape(1,-1)对应于一个 1 行x=12/1=12 列的数组。

于 2020-05-26T21:00:46.677 回答
12

长话短说:你设置了一些维度,让 NumPy 设置剩余的。

(userDim1, userDim2, ..., -1) -->>

(userDim1, userDim1, ..., TOTAL_DIMENSION - (userDim1 + userDim2 + ...))
于 2018-12-08T15:26:46.163 回答
10
import numpy as np
x = np.array([[2,3,4], [5,6,7]]) 

# Convert any shape to 1D shape
x = np.reshape(x, (-1)) # Making it 1 row -> (6,)

# When you don't care about rows and just want to fix number of columns
x = np.reshape(x, (-1, 1)) # Making it 1 column -> (6, 1)
x = np.reshape(x, (-1, 2)) # Making it 2 column -> (3, 2)
x = np.reshape(x, (-1, 3)) # Making it 3 column -> (2, 3)

# When you don't care about columns and just want to fix number of rows
x = np.reshape(x, (1, -1)) # Making it 1 row -> (1, 6)
x = np.reshape(x, (2, -1)) # Making it 2 row -> (2, 3)
x = np.reshape(x, (3, -1)) # Making it 3 row -> (3, 2)
于 2020-04-10T05:40:24.527 回答
3

np.reshape()直到我读了这篇文章,我才明白是怎么回事。

从机械上讲,它是做什么的很清楚reshape()。但是我们如何解释重塑前后的数据呢?

对我来说缺少的部分是:

当我们训练机器学习模型时,数组的嵌套级别具有精确定义的含义。

这意味着 reshape 操作必须敏锐地意识到以下两点,然后操作才有任何意义:

  • 它操作的数据(重塑输入的样子)
  • 算法/模型如何期望重塑的数据(重塑输出的样子)

例如:

外部数组包含观察/行。内部数组包含列/特征。当我们只有一个特征的多个观察值数组或多个特征的单个观察值时,这会导致两种特殊情况。

有关更高级的示例:请参阅此 stackoverflow 问题

于 2021-01-26T02:46:08.560 回答
1

当您使用 -1 (或任何其他负整数,我做了这个测试 kkk)

b = numpy.reshape(a, -1)

您只是说numpy.reshape要自动计算向量的大小(行 x 列)并将其重新定位到具有该维度的一维向量中。这个命令很有趣,因为它会自动为您执行。如果您想通过输入一个正整数值将向量重塑为一维,则该reshape命令仅在您正确输入值“行 x 列”时才有效。因此,您知道,能够输入负整数会使过程更容易。

于 2021-07-21T06:51:49.653 回答