Python 形状为(N,1)的数组与形状为(N)的数组有什么区别?如何在两者之间转换?

Python 形状为(N,1)的数组与形状为(N)的数组有什么区别?如何在两者之间转换?,python,arrays,numpy,Python,Arrays,Numpy,Python新手来自MATLAB背景 我有一个1列数组,我想将该列移动到3列数组的第一列。有了MATLAB背景,我会这样做: import numpy as np A = np.zeros([150,3]) #three column array B = np.ones([150,1]) #one column array which needs to replace the first column of A #MATLAB-style solution: A[:,0] = B 但是

Python新手来自MATLAB背景

我有一个1列数组,我想将该列移动到3列数组的第一列。有了MATLAB背景,我会这样做:

import numpy as np

A = np.zeros([150,3]) #three column array

B = np.ones([150,1]) #one column array which needs to replace the first column of A

#MATLAB-style solution:

A[:,0] = B
但是这不起作用,因为A的“形状”是(150,3),B的“形状”是(150,1)。显然,命令A[:,0]的结果是(150)的“形状”

那么,(150,1)和(150)之间的区别是什么?它们不是一样的东西吗:列向量?为什么Python还没有“足够聪明”来理解我想把列向量B放到A的第一列中

有没有一种简单的方法可以将具有形状(N,1)的单列向量转换为具有形状(N)的单列向量?

我是Python新手,这似乎是一件非常愚蠢的事情,因为MATLAB做得更好…

使用方法消除大小为1的维度

A[:,0] = B.squeeze()
或者从创建B一维开始:

B = np.ones([150])
NumPy保持一维数组和二维数组(其中一个维度为1)之间的区别这一事实是合理的,特别是当人们开始使用n维数组时

回答标题中的问题:形状数组
(3,)
之间存在明显的结构差异,例如

[1, 2, 3]
[[1], [2], [3]]
以及形状
(3,1)
的数组,例如

[1, 2, 3]
[[1], [2], [3]]

有几件事是不同的。在
numpy
中,数组可以是0d或1d或更高。在MATLAB中,2d是最小的(并且一度是唯一的尺寸)。MATLAB很容易扩展端点,因为它是
Fortran排序的
numpy
,默认情况下是按c排序的,并且最容易在前面扩展尺寸

In [1]: A = np.zeros([5,3])
In [2]: A[:,0].shape   
Out[2]: (5,)
无论是
a[0,:]
还是
a[:,0]
,简单的索引都可以减少维度。与之相比,3d MATLAB矩阵,
a(1,:,:)
v
a(:,:,1)

numpy
执行
广播
,在求和和和赋值等操作期间调整维度。一个基本规则是,如果需要,维度可以自动向起点展开:

In [3]: A[:,0] = np.ones(5)
In [4]: A[:,0] = np.ones([1,5])
In [5]: A[:,0] = np.ones([5,1])
...
ValueError: could not broadcast input array from shape (5,1) into shape (5)
它可以将
(5,)
LHS更改为(1,5),但不能将其更改为(5,1)

另一个广播示例,
+

In [6]: A[:,0] + np.ones(5);
In [7]: A[:,0] + np.ones([1,5]);
In [8]: A[:,0] + np.ones([5,1]);
现在(5,)与(5,1)一起工作,但那是因为它变成了(1,5),与(5,1)一起产生(5,5)-一种外部产品广播:

In [9]: (A[:,0] + np.ones([5,1])).shape
Out[9]: (5, 5)

八度

>> x = ones(2,3,4);
>> size(x(1,:,:))
ans =
   1   3   4
>> size(x(:,:,1))
ans =
   2   3
>> size(x(:,1,1) )
ans =
   2   1
>> size(x(1,1,:) )
ans =
   1   1   4

要完成您想要的任务,请调整任一侧

以保留维度数量的方式编制索引:

In [11]: A[:,[0]].shape    
Out[11]: (5, 1)
In [12]: A[:,[0]] = np.ones([5,1])
将(5,1)转换为(1,5):

将(5,1)展平/展开至(5,):

挤压
拉威尔
也有效


一些倍频程的快速测试表明,当涉及到尺寸不匹配时,它更宽容。但是
numpy
优先考虑一致性。一旦理解了广播规则,行为就有了意义。

在MATLAB中,矩阵总是2d(或更高)。从numpy的角度来看,这是一个人工构造。为什么不是1d(向量)甚至0d?