选择numpy数组的列

时间:2016-04-01 18:19:11

标签: python arrays numpy matrix vector

我对选择NumPy数组的列感到有些困惑,因为结果与Matlab甚至NumPy矩阵不同。请参阅以下案例。

Matlab 中,我们使用以下命令从矩阵中选择列向量。

x = [0, 1; 2 3]
out = x(:, 1)

然后out变为[0; 2],这是一个列向量。

使用 a NumPy Matrix

执行相同的操作
x = np.matrix([[0, 1], [2, 3]])
out = x[:, 0]

然后输出为np.matrix([[0], [2]]),这是预期的,它是一个列向量。

但是,如果是 NumPy数组

x = np.array([[0, 1], [2, 3]])
out = x[:, 0]

输出为np.array([0, 2]),为1维,因此它不是列向量。我的期望应该是np.array([[0], [2]])。 我有两个问题。

1。 为什么NumPy数组的输出与NumPy矩阵的情况不同?这给我带来了很多困惑,但我认为可能有一些原因。

2. 要从2-Dim NumPy数组中获取列向量,我是否应该执行其他操作,例如expand_dims

x = np.array([[0, 1], [2, 3]])
    out = np.expand_dims(x[:, 0], axis = 1)

1 个答案:

答案 0 :(得分:10)

在MATLAB中,一切都至少有2个维度。在较旧的MATLAB中,2d是它,现在它们可以有更多。 np.matrix以旧的MATLAB为模型。

当您索引3d矩阵时,MATLAB会做什么?

np.array更为一般。它可以有0,1,2或更多维度。

x[:, 0]
x[0, :]

都选择一列或一行,并返回一个维度较少的数组。

x[:, [0]]
x[[0], :]

将返回带有单个维度的2d数组。

在Octave(MATLAB克隆)中,索引会产生不一致的结果,具体取决于我选择的矩阵的哪一侧:

octave:7> x=ones(2,3,4);
octave:8> size(x)
ans =
   2   3   4

octave:9> size(x(1,:,:))
ans =
   1   3   4

octave:10> size(x(:,:,1))
ans =    
   2   3

MATLAB / Octave在最后增加了尺寸,显然也很容易将它们压在那边。

numpy按其他方向订购尺寸,并可根据需要在开头添加尺寸。但是在索引时挤出单个维度是一致的。

numpy可以具有任意数量的维度,而MATLAB至少具有2这一事实是一个至关重要的区别,通常会使MATLAB用户绊倒。但是,没有一个比另一个更合乎逻辑。 MATLAB的实践更多的是历史问题而非一般原则。