关于python:-1在numpy重塑中意味着什么?

What does -1 mean in numpy reshape?

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

例如:

1
2
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]表示最后一个元素。你能解释一下吗?


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

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

现在看看这个例子。

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

现在尝试用(-1)重新整形。结果新形状为(12,图1),与原形状(3,4)相匹配。

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

现在尝试用(-1,1)重新整形。我们已将列提供为1,但行提供为未知。所以我们得到的结果是新形状为(12,1)。再次与原始形状(3,4)兼容。

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

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

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

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

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

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

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

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

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

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

1
2
z.reshape(-1, -1)
ValueError: can only specify one unknown dimension


用于调整数组的形状。

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

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

现在我们要将形状改为5 x 5 x 8:

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

会完成任务的。

请注意,一旦修复了第一个dim=5和第二个dim=5,就不需要确定第三个维度。为了帮助您的懒惰,python提供了-1选项:

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

会给你一个形状数组=(5,5,8)。

同样地,

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

会给你一个形状数组=(50,4)

您可以在http://anie.me/numpy-remaze-transmose-theano-dimshuffle上阅读更多内容。/


根据the documentation的规定:

newshape : int or tuple of ints

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.


numpy.重塑(a,newshape,order)有关详细信息,请查看下面的链接。https://docs.scipy.org/doc/numpy/reference/generated/numpy.reforme.html网站

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

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

输出:

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

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

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

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

数组([[0],

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

b=np.arange(10).整形((1,-1))

输出:(是一维行数组)

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


这很容易理解。"-1"代表"未知维度",可以从另一个维度推断。在这种情况下,如果按如下方式设置矩阵:

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

像这样修改矩阵:

1
b = numpy.reshape(a, -1)

它将对矩阵A调用一些死机操作,这将返回一个一维numpy数组/martrix。

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

1
b = a.reshape(1,-1)

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


长话短说:您设置了一些维度,让numpy设置其余的维度。

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

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