如何在numpy中保持向量的行/列方向?

7 浏览
0 Comments

如何在numpy中保持向量的行/列方向?

作为一个Matlab/Octave的背景,我一直在努力学习numpy。有一件事情一再让我困惑,那就是向量和多维数组之间的区别。在这个问题上,我将给出一个我遇到的具体问题,但如果有人能解释一下numpy中单维数组的更一般的情况,为什么你首先要使用它们,如何避免在混合使用单维和多维数组时遇到麻烦,我将非常感激。无论如何,问题如下:\n我有一个名为X的2维数组:\nX = numpy.arange(10).reshape(2,5)\n我想将X的最后一列作为另一个2维数组(即列向量)Y存储起来。我目前能想到的唯一方法是:\nY = numpy.atleast_2d(X[:,4]).T\n但我不喜欢这种方法,原因如下:\n1. 我觉得在X[:,4]中应该能够隐含地表示向量的转置,而不需要明确告诉它。\n2. 在需要经常出现这种情况的代码中,使用atleast_2D似乎很麻烦。感觉像是我在做错了什么事情。\n简而言之,有更好的方法吗?\n谢谢。

0
0 Comments

问题的出现原因是在使用numpy进行向量操作时,有时会出现行或列的方向被改变的情况。解决方法是使用子集操作来保持行列的方向。

在numpy中,可以使用切片或索引来对矩阵进行子集操作。通过使用切片或索引,可以保持矩阵的行列方向。

另外,这种子集操作与Pandas数据框的操作方式有些相似。当对数据框进行索引操作时,会返回一个Series对象;当对数据框进行子集或切片操作时,会返回一个新的数据框。

参考链接:

- [https://stackoverflow.com/a/69861473/16936415](https://stackoverflow.com/a/69861473/16936415)

0
0 Comments

问题的原因是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]。希望你明白了。

问题的解决方法是使用切片索引方式来维持行列的方向。如果想要索引第i列并保持方向,可以使用my_array[:, i: i+1]的语法。虽然这种方式可能容易出错,但是如果你要保持方向,那你可能在使用上有问题。1D数组实际上没有方向,更自然的方式是不考虑方向来处理它。当你试图将方向等概念强加给数组时,在Python/NumPy中,你就会做出像这样“容易出错和难以阅读”的事情。

有人认为NumPy应该更容易地识别向量的方向,但是我认为这种要求有点不合理。NumPy的开发人员决定不给1D数组赋予方向。要求NumPy更容易地识别向量方向实际上是说这个决定是错误的,我认为这是不合理的。当然,他们可以做出其他合理的决定,但我认为这个决定是相当明智的。毕竟,线性代数远不止于2D矩阵操作。

有人认为NumPy开发人员的决定是错误的是不合理的吗?不确定我是否同意,即使我并不一定认为任何决定是错误的。我也不确定不给1D数组赋予方向的任何决定是否成功。结果是NumPy的1D数组在线性代数运算中确实有一个方向,至少在线性代数操作中有这个方向,而改变这个方向似乎需要使用容易出错的语法。我相当确定这可以通过多种方式解决,从而改进当前(通常非常好的)包。

是的,我是说当你说这个特定的决定是错误的时,这是不合理的,因为它只是与其他系统不同而已。当然你可以持不同意见。无论如何,我的主要观点是NumPy的1D数组没有方向,说它有方向是不正确的。我不知道这是否适用于这个问题,但我经常看到一些人(通常是有Matlab/Octave背景的人)无法理解1D数组没有方向意味着什么,这阻碍了他们能够有效地理解和使用NumPy数组。

0