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课程推荐。
在这里插入图片描述

<think>我们正在讨论NumPy中的reshape函数,特别是第一个参数设置为-1时的含义。根据引用[2]和引用[4]:当我们在reshape函数中使用-1作为参数时,它表示该维度的大小将由数组原来的大小和其他维度的大小自动推断出来,以保证新数组的元素总数与原数组一致。具体来说,reshape函数的参数-1的作用是:让NumPy自动计算该维度的大小。例如:1.如果我们有一个数组z,其形状为(4,4),即16个元素。2.当我们使用z.reshape(-1)时,它会将数组展平为一维数组,形状为(16,)。3.当我们使用z.reshape(-1,1)时,我们想要一个二维数组,其中第二维的大小为1(即一列),那么第一维的大小就会被自动计算为16(因为16/1=16),所以形状为(16,1)。4.当我们使用z.reshape(2,-1)时,我们指定第一维大小为2,那么第二维的大小就会被计算为8(因为16/2=8),所以形状为(2,8)。因此,-1的作用就是“自动计算该维度的大小”,使得数组元素总数不变。注意:在reshape函数中,最多只能有一个维度指定为-1,因为如果有两个维度都未知,就无法唯一确定。下面我们根据引用[4]中的例子来具体说明:例子:>>>importnumpyasnp>>>z=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])>>>z.shape(4,4)#展平为一维数组>>>z.reshape(-1)array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16])#转换为列向量(二维数组,每行一个元素)>>>z.reshape(-1,1)array([[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16]])#转换为2行,列数自动计算(8列)>>>z.reshape(2,-1)array([[1,2,3,4,5,6,7,8],[9,10,11,12,13,14,15,16]])总结:在NumPy的reshape函数中,使用-1作为参数可以让该维度的大小由其他维度和总元素数自动推断出来,这样我们就不需要显式地计算该维度的大小,同时保证了数组元素总数不变。相关问题:1.在NumPy中,reshape函数最多可以有几个维度设置为-1?2.使用reshape(-1)和flatten()方法有什么区别?3.如果数组元素总数无法根据给定的维度整除(比如数组有10个元素,reshape(3,-1)),会发生什么?</think>### NumPy中`reshape`函数参数`-1`的含义与作用 在NumPy中,`reshape`函数的第一个参数设为`-1`时,其核心含义是**自动计算该维度的大小**,确保新数组的元素总数与原数组保持一致。具体原理如下: #### 1. **自动维度计算** - 当某个维度指定为`-1`时,NumPy会根据数组的**总元素个数**和**其他已知维度**自动计算出该维度的大小。 - 计算公式为: $$ \text{未知维度大小} = \frac{\text{总元素数}}{\prod(\text{已知维度大小})} $$ - 例如: - 数组`z`形状为`(4, 4)`(共16个元素): ```python z.reshape(-1) # 输出形状:(16,) [展平为一维] z.reshape(-1, 1) # 输出形状:(16,1) [自动计算行数为16] z.reshape(2, -1) # 输出形状:(2,8) [自动计算列数为8] ``` #### 2. **核心规则** - **元素总数守恒**:新数组的元素数必须严格等于原数组元素数,否则报错。 - **唯一未知量**:`-1`只能在**一个维度**中使用(否则无法唯一确定维度大小)。 - **维度兼容性**:已知维度的乘积必须能整除总元素数(如10个元素的数组无法`reshape(3,-1)`)。 #### 3. **典型用例** - **展平数组**: `z.reshape(-1)` → 等价于`z.flatten()`,但更高效(不复制数据)[^1]。 - **生成列向量**: `z.reshape(-1, 1)` → 将任意数组转为$N\times1$的列向量。 - **维度降维**: 若原始维度为`(2,3,4)`,`z.reshape(-1,4)` → 输出形状`(6,4)`(合并前两维)。 #### 4. **与显式维度的对比** | 操作 | 显式写法 | 使用`-1`的等价写法 | |------|----------|-------------------| | 展平 | `z.reshape(16)` | `z.reshape(-1)` | | 转列向量 | `z.reshape(16,1)` | `z.reshape(-1,1)` | | 分两行 | `z.reshape(2,8)` | `z.reshape(2,-1)` | > **关键优势**:无需手动计算维度大小,提升代码的**可读性**和**适应性**(尤其当数据规模动态变化时)[^2][^3]。
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是管小亮

一口吃掉你的打赏,嗝~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值