【问题标题】:How do I maintain row/column orientation of vectors in numpy?如何在 numpy 中保持向量的行/列方向?
【发布时间】:2013-02-16 09:26:15
【问题描述】:

来自 Matlab/Octave 的背景,我一直在尝试学习 numpy。一直困扰我的一件事是向量和多维数组之间的区别。对于这个问题,我将给出一个我遇到的具体问题,但如果有人还可以解释 numpy 中一维数组背后的更一般的图片,我将非常感激,为什么你首先想要它们,如何避免混合单维和多维数组等时出现麻烦。无论如何,问题:

我有一个名为 X 的二维数组:

X = numpy.arange(10).reshape(2,5)

我想获取 X 的最后一列并将其存储为另一个名为 Y 的二维数组(即列向量)。为此我能想到的唯一方法是:

Y = numpy.atleast_2d(X[:,4]).T

但我不喜欢这样有几个原因:

  1. 我觉得我不应该告诉它在 X[:,4] 中隐含方向时转置向量。

  2. 在经常出现这种情况的代码中,使用 atleast_2D 似乎很麻烦。感觉我做错了什么。

那么,简而言之,有没有更好的方法呢?

谢谢。

【问题讨论】:

  • np.atleast_2d(x).T 也可以写成x.reshape(-1, 1)。如果你经常这样做,为它定义一个帮助器可能是个好主意,def ascolumn(x): return x.reshape(-1, 1)。

标签: python numpy


【解决方案1】:

首先,做你想做的事情的简单方法:

Y = X[:,4:]

现在,numpy 在您之前尝试时没有这样做的原因与数组在 Python 中的工作方式有关,实际上在大多数编程语言中也是如此。当您编写a[4] 之类的内容时,这是在访问数组的第五个元素,而不是让您查看原始数组的某些部分。例如,如果a 是一个数字数组,那么a[4] 将只是一个数字。如果a 是一个二维数组,即实际上是一个数组数组,那么a[4] 将是一个一维数组。基本上,访问数组元素的操作会返回比原始数组少一维的东西。

现在,Python 包含了一种称为“切片表示法”的东西,它使用冒号表示,这是一种访问数组元素的不同方式。它不是返回一个元素(比原始数组小一维的东西),而是返回原始数组的一部分的副本。本质上,a:b 表示索引a(包括)到b(不包括)处的所有元素的列表。 a 或 b 或两者都可以省略,在这种情况下,切片会一直到达数组的对应端。

这对您的情况意味着,当您编写 X[:,4] 时,您有一个切片表示法和一个常规索引表示法。切片表示法表示沿第一维的所有索引(只有 0 和 1,因为数组有两行),而 4 表示沿第二维的第五个元素。正则索引的每个实例基本上都会将返回对象的维数减一,因此由于X 是一个二维数组,并且有一个正则索引,因此您会得到一维结果。 Numpy 只是将一维数组显示为行向量。诀窍是,如果您想得到与开始时相同尺寸的东西,那就使用所有切片索引,就像我在本文顶部的示例中所做的那样。

如果要提取总列数超过 5 列的内容的第五列,可以使用 X[:,4:5]。如果您想要查看第 3-4 行和第 5-7 列,您可以使用X[3:5,5:8]。希望你能明白。

【讨论】:

  • 这非常有用!
  • 稍微更精确的答案似乎是Y = X[:,4:5],即使X恰好只有5列。
  • 它返回一个视图而不是一个副本,“它返回一个原始数组部分的视图”
  • @David Z 所以要在索引列i 时保持方向,你已经写了my_array[:, i: i+1] ????这很容易出错而且很可怕,不是吗?
  • @OldSchool 是的,但如果你试图保持方向,你可能做错了。一维数组实际上没有方向,使用它的更自然的方法是没有任何方向的想法。当您尝试在 Python/NumPy 中将外部概念(例如方向)强加到数组上时,您最终会做这样的“容易出错且可怕的”事情。
【解决方案2】:

子集

更简单的方法是对矩阵进行子集化。

>>> X
[[0 1 2 3 4]
 [5 6 7 8 9]]

>>> X[:, [4]]
[[4]
 [9]]

>>> X[:, 4]
[4 9]

它的工作方式有点类似于 Pandas 数据框。如果你索引数据框,它会给你一个系列。如果您对数据框进行子集化或切片,它会为您提供一个数据框。

另见

【讨论】:

    猜你喜欢
    • 2013-07-11
    • 2016-07-22
    • 2015-05-23
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    相关资源
    最近更新 更多