将numpy(n,)向量重塑为(n,1)向量

tom*_*tom 6 python numpy

因此,当我需要做一些线性代数时,我更容易将向量看作列向量.因此我更喜欢像(n,1)这样的形状.

形状(n,)和(n,1)之间是否存在显着的内存使用差异?

什么是首选方式?

以及如何将(n,)向量重塑为(n,1)向量.不知怎的,b.reshape((n,1))没有做到这一点.

a = np.random.random((10,1))
b = np.ones((10,))
b.reshape((10,1))
print(a)
print(b)

[[ 0.76336295]
 [ 0.71643237]
 [ 0.37312894]
 [ 0.33668241]
 [ 0.55551975]
 [ 0.20055153]
 [ 0.01636735]
 [ 0.5724694 ]
 [ 0.96887004]
 [ 0.58609882]]
[ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]
Run Code Online (Sandbox Code Playgroud)

Ilj*_*ilä 8

ndarray.reshape()返回一个新视图或一个副本(取决于新形状).它不会修改数组.

b.reshape((10, 1))
Run Code Online (Sandbox Code Playgroud)

因此,实际上是无操作,因为创建的视图/副本没有分配给任何东西."修复"很简单:

b_new = b.reshape((10, 1))
Run Code Online (Sandbox Code Playgroud)

两种形状之间使用的内存量应该完全不同.Numpy数组使用步幅的概念,因此维度(10,)(10, 1)都可以使用相同的缓冲区; 跳转到下一行和列的数量只是改变.

  • 形状`(10,)`的数组是一维"行"向量,可以在问题的打印输出中看到.Shape`(10,1)`生成一个列向量,或一个10行,1列的矩阵. (2认同)

小智 8

使用 python 语法糖更简单的方法是使用

b.reshape(-1,1)
Run Code Online (Sandbox Code Playgroud)

系统将自动计算正确的形状而不是“-1”

  • 这可行,但您仍然需要执行 `b_new = b.reshape(-1, 1)` 将重塑后的副本分配给变量,正如 Ilja Everilä 指出的那样。 (2认同)