-1在numpy重塑中意味着什么?

时间:2013-09-09 03:25:03

标签: python numpy

可以使用带参数-1的重塑函数将numpy矩阵重新整形为矢量。但我不知道-1在这里意味着什么。

例如:

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

b的结果是:matrix([[1, 2, 3, 4, 5, 6, 7, 8]])

有谁知道-1在这里意味着什么? 似乎python赋予-1几个含义,例如:array[-1]表示最后一个元素。你能解释一下吗?

11 个答案:

答案 0 :(得分:384)

满足提供新形状的标准是'新形状应与原始形状兼容'

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)。我们已将列提供为1但行未知。因此我们得到结果新形状为(12,1).again与原始形状(3,4)

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

新形状为(-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]])

新形状(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

答案 1 :(得分:62)

用于重塑数组。

假设我们有一个尺寸为2 x 10 x 10的三维数组:

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

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

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

将完成这项工作。

请注意,一旦你修复了第一个dim = 5和第二个dim = 5,你就不需要确定第三个维度了。为了帮助你懒惰,python提供了-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/

了解更多信息

答案 2 :(得分:56)

根据the documentation

  

newshape:int或int of int

     

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

答案 3 :(得分:14)

numpy.reshape(一,newshape,为了{}) 请查看以下链接以获取更多信息。 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)

输出:

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

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

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

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

阵列([[0],

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

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

输出:(是一维行数组)

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

答案 4 :(得分:12)

这很容易理解。 “-1”代表“未知维度”,可以从另一个维度进行推测。 在这种情况下,如果您将矩阵设置为:

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

像这样修改你的矩阵:

b = numpy.reshape(a, -1)

它将对矩阵a调用一些失败的操作,这将返回1-d numpy array / martrix。

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

b = a.reshape(1,-1)

它会给你相同的结果,让读者更清楚地理解:将b设置为另一种形状。对于a,我们不应该有多少列(将其设置为-1!),但我们需要一个1维数组(将第一个参数设置为1!)。

答案 5 :(得分:8)

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)

答案 6 :(得分:6)

长话短说:您设置了一些尺寸,然后让NumPy设置其余的尺寸。

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

(userDim1, userDim1, ..., TOTAL_DIMENSION - (userDim1 + userDim2 + ...))

答案 7 :(得分:6)

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

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

示例

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


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

答案 8 :(得分:1)

在阅读this article之前,我无法理解np.reshape()的作用。

在机制上很清楚 reshape() 的作用。但是我们如何解释重塑前后的数据?

对我来说缺失的部分是:

<块引用>

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

这意味着重塑操作必须敏锐地意识到以下两点,操作才有意义:

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

例如:

<块引用>

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

更高级的例子: 见this stackoverflow question

答案 9 :(得分:1)

当您在

中使用 -1(或任何其他负整数,我进行了此测试 k​​kk)时
b = numpy.reshape(a, -1)

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

答案 10 :(得分:0)

这只是意味着您不确定可以提供多少行或列,而您正在要求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]]