numpy中的矩阵索引


问题内容

在涉及矩阵运算的小型Python脚本的开发过程中,我感到困惑,因此我启动了一个外壳来玩一个玩具示例,并加深了对Numpy中矩阵索引的理解。

这是我所做的:

>>> import numpy as np
>>> A = np.matrix([1,2,3])
>>> A
matrix([[1, 2, 3]])
>>> A[0]
matrix([[1, 2, 3]])
>>> A[0][0]
matrix([[1, 2, 3]])
>>> A[0][0][0]
matrix([[1, 2, 3]])
>>> A[0][0][0][0]
matrix([[1, 2, 3]])

可以想象,这并 没有
帮助我更好地理解Numpy中的矩阵索引。这种行为对于我将其描述为“自身数组”的东西来说是有意义的,但是我怀疑在他们的头脑中是否有人会选择它作为科学图书馆中矩阵的模型。

那么,我获得的输出的逻辑是什么?为什么矩阵对象的第一个元素是自身?

PS:我知道如何获取矩阵的第一项。我感兴趣的是此设计决策背后的逻辑。

编辑:我不是在问如何访问矩阵元素,或者为什么矩阵行的行为类似于矩阵。我要求定义一个具有单个数字的矩阵的行为。这是数组的典型操作,但是产生的行为与您从数组中期望的行为完全不同。我想知道这是如何实现的,以及设计决策背后的逻辑是什么。


问题答案:

索引后查看形状:

In [295]: A=np.matrix([1,2,3])
In [296]: A.shape
Out[296]: (1, 3)
In [297]: A[0]
Out[297]: matrix([[1, 2, 3]])
In [298]: A[0].shape
Out[298]: (1, 3)

此行为的关键np.matrix是始终为2d。因此,即使您选择一行(A[0,:]),结果仍然是2d shape
(1,3)。因此,您可以随心所欲地串[0]起来,没有新的事情发生。

您想完成A[0][0]什么?一样A[0,0]吗?对于基np.ndarray类,它们是等效的。

注意,Python解释器将索引转换为__getitem__调用。

 A.__getitem__(0).__getitem__(0)
 A.__getitem__((0,0))

[0][0]是2个索引操作,而不是一个。因此,第二种的效果[0]取决于第一种的产生。

对于数组A[0,0]等效于A[0,:][0]。但是对于矩阵,您需要执行以下操作:

In [299]: A[0,:][:,0]
Out[299]: matrix([[1]])  # still 2d

============================

“一个数组本身”,但是我怀疑任何一个在他们的头脑中正确的人都会选择它作为科学图书馆中矩阵的模型。

那么,我获得的输出的逻辑是什么?为什么矩阵对象的第一个元素是自身?

另外,A [0 ,:]与A [0]不同

根据这些评论,让我提出一些澄清。

A[0]并不意味着“返回第一个元素”。表示沿第一轴选择。对于一维数组,表示第一项。对于二维数组,它表示第一行。因为ndarray那将是一个1d数组,但对于amatrix则是另一个matrix。因此对于2d数组或矩阵,A[i,:]与相同A[i]

A[0]不仅返回自己。它返回一个新矩阵。不同id

In [303]: id(A)
Out[303]: 2994367932
In [304]: id(A[0])
Out[304]: 2994532108

它可能具有相同的数据,形状和步幅,但这是一个新对象。它ith与多行矩阵的行一样唯一。

大多数独特的matrix活动在中定义:numpy/matrixlib/defmatrix.py。我本来建议您看一下该matrix.__getitem__方法,但是大多数操作都在中执行np.ndarray.__getitem__

np.matrix类的添加numpy是为了方便老式的MATLAB程序员。
numpy数组几乎可以具有任意数量的维,即0、1…。尽管2000年左右的版本将其推广到2个或更多,但MATLAB仅允许2个。