Python Numpy中的矩阵索引

Python Numpy中的矩阵索引,python,numpy,matrix,Python,Numpy,Matrix,在开发一个涉及矩阵操作的小型Python脚本的过程中,我变得越来越困惑,因此我启动了一个shell来玩一个玩具示例,并更好地理解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] mat

在开发一个涉及矩阵操作的小型Python脚本的过程中,我变得越来越困惑,因此我启动了一个shell来玩一个玩具示例,并更好地理解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。矩阵
总是二维的。因此,即使选择一行(
A[0,:]
),结果仍然是2d,shape
(1,3)
。因此,您可以随心所欲地使用任意数量的
[0]
,而不会发生任何新的情况

您想用
A[0][0]
实现什么?与
A[0,0]
相同? 对于基本
np.ndarray
类,这些是等效的

请注意,
Python
解释器将索引转换为
\uuu getitem\uuu
调用

 A.__getitem__(0).__getitem__(0)
 A.__getitem__((0,0))
[0][0]
是两个索引操作,而不是一个。因此,第二个
[0]
的效果取决于第一个生成的内容

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

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

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

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

此外,[0,:]与[0]不同

鉴于这些评论,让我提出一些澄清

A[0]
并不表示“返回第一个元素”。这意味着沿第一个轴选择。对于表示第一项的1d数组。对于二维数组,它表示第一行。对于
ndarray
而言,这将是一个1d数组,但对于
matrix
而言,这是另一个
matrix
。因此,对于二维数组或矩阵,
a[i,:]
a[i]
是一样的

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

In [303]: id(A)
Out[303]: 2994367932
In [304]: id(A[0])
Out[304]: 2994532108
它可能具有相同的数据、形状和步幅,但它是一个新对象。它就像多行矩阵的第i行一样唯一

大多数独特的
矩阵
活动定义在:
numpy/matrixlib/defmatrix.py
。我打算建议查看
矩阵。\uuuu getitem\uuuu
方法,但大多数操作都是在
np.ndarray.\uu getitem\uuuu
中执行的


np.matrix
类被添加到
numpy
中,以方便老派MATLAB程序员
numpy
数组几乎可以有任意数量的维度,0、1、。。。。MATLAB只允许2个,尽管2000年左右的版本将其概括为2个或更多

>> A = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) 
如果要获取第二列值,请使用以下命令:

>> A.T[1]
array([ 2,  6, 10])

语法是[dim1,dim2,…]。对于这种情况,要获取第一个元素,您需要执行[0,0],第二个元素作为[0,1],第三个元素作为[0,2]。这是一个1 x 3的矩阵。有人读过PS吗?
矩阵
类是硬编码的,总是有两个维度(即行和列)。这是通过切片和索引操作保留的(除非您访问单个元素,例如
a[0,0]
)。顺便说一下,对于大多数应用,首选
ndarray
类(即标准numpy数组);搜索
numpy array vs matrix
以查找有关此主题的大量讨论。当我第一次需要在numpy中进行矩阵数学运算时,我能找到的所有帮助都指导我使用ndarray。它更灵活,而且对于我测试的每一件事情,它都更快。我不明白这种行为是如何导致矩阵总是二维的。此外,A[0,:]与A[0]不同(即使它们在本例中产生相同的结果),因此在numpy眼中矩阵行是矩阵这一事实并不能解释我发布的行为。然而,有趣的是,索引转换为getitem。看到实现可能会对此有所启发。我不明白的是,如果类的行为不是数组的行为,为什么要在类中实现数组操作。对数组进行索引通常会返回数组本身以外的内容。