python reshape函数参数-1(X.reshape(X.shape[0], -1).T)

欢迎关注WX公众号:【程序员管小亮】

近来在看吴恩达深度学习作业的时候,看到这么一行代码,发现网上说的清楚的文章比较少,特此记录。

X.reshape(X.shape[0], -1).T

X.reshape(X.shape[0], -1).T可以将一个维度为(a,b,c,d)的矩阵转换为一个维度为(b∗c∗d, a)的矩阵。

举例子说明一下就清楚是怎么回事了。

例子1:

>>> X.shape
(209, 64, 64, 3)

我们假设x的shape是(209, 64, 64, 3)的。

>>> X.shape[0]
209

然后,我们说shape[0]就是第一个列的行数,也就是209。

>>> X.reshape(X.shape[0], -1)
(209, 64*64*3)

通过reshape重新建立维度,第一个维度就是X.shape[0],这就是正常的reshape操作;第二个维度是-1,我们知道X的shape属性是多少,是(209, 64, 64, 3),但是想让X变成209行,列数不知道是多少,所以也就是209 * 64 * 64 * 3 / 209,也就是64 * 64 * 3。

>>> X.reshape(X.shape[0], -1).T
(64*64*3, 209)

所以A trick when you want to flatten a matrix X of shape (a,b,c,d) to a matrix X_flatten of shape (b ∗∗ c ∗∗ d, a) is to use:

X.reshape(X.shape[0], -1).T

例子2:

import numpy as np

z = np.array([[1, 2, 3, 4],
              [5, 6, 7, 8]])
a = z.shape
b = z.reshape(-1)
print("a:",a)
print("b:",b)
> a: (2, 4)
> b: [1 2 3 4 5 6 7 8]

正常的shape和reshape。

import numpy as np

z = np.array([[1, 2, 3, 4],
              [5, 6, 7, 8]])
c = z.reshape(-1, 1)
print("c:",c)
> c: [[1]
 	  [2]
 	  [3]
	  [4]
	  [5]
	  [6]
	  [7]
	  [8]]

先前我们不知道z的shape属性是多少,但是想让z变成只有一列,行数不知道多少,通过z.reshape(-1,1),Numpy自动计算出有8行,新的数组shape属性为(8, 1),与原来的(2, 4)配套。

import numpy as np

z = np.array([[1, 2, 3, 4],
              [5, 6, 7, 8]])
d = z.reshape(-1, 2)
print("d:",d)
> d: [[1 2]
	  [3 4]
	  [5 6]
	  [7 8]]

和上面一样,newshape等于-1,列数等于2,行数未知,通过z.reshape(-1,2),新的数组shape属性为(4, 2)。

总结一下,参数-1就是不知道行数或者列数多少的情况下使用的参数,所以先确定除了参数-1之外的其他参数,然后通过(总参数的计算) / (确定除了参数-1之外的其他参数) = 该位置应该是多少的参数。

python课程推荐。
在这里插入图片描述

原文地址:https://www.cnblogs.com/hzcya1995/p/13302844.html