【问题标题】:Selecting a column of a numpy array选择 numpy 数组的一列
【发布时间】:2016-07-21 16:02:02
【问题描述】:

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

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

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

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

NumPy 矩阵

做同样的事情
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]),它是一维的,所以它不是列向量。我的期望是应该是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)

【问题讨论】:

  • 由于广播的工作方式,您不应该关心一维向量是行还是列。随心所欲地使用它。

标签: python arrays numpy matrix vector


【解决方案1】:

在 MATLAB 中,一切都至少有 2 个维度。在较旧的 MATLAB 中,只有 2d,现在他们可以拥有更多。 np.matrix 是在那个旧的 MATLAB 上建模的。

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

np.array 更通用。它可以有 0、1、2 或更多维度。

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

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

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

将返回二维数组,具有单一维度。

在 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 的实践比一般原则更具有历史意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 2023-03-29
    • 2017-07-22
    • 2014-02-20
    • 1970-01-01
    相关资源
    最近更新 更多