Numpy中的矩阵索引

2024-05-20 22:03:33 发布

您现在位置:Python中文网/ 问答频道 /正文

在一个涉及矩阵操作的小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中的矩阵索引。这种行为对于我称之为“自身数组”的东西来说是有意义的,但我怀疑任何头脑正常的人都会选择它作为科学图书馆中矩阵的模型。

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

我知道如何得到矩阵的第一个项。我感兴趣的是这个设计决策背后的逻辑。

编辑:我不是问如何访问矩阵元素,或者为什么矩阵行的行为像矩阵。我要求一个定义,当一个矩阵的行为与一个单一的数字索引。这是一个典型的数组行为,但其结果与您期望的数组行为完全不同。我想知道这是如何实现的,以及设计决策背后的逻辑是什么。


Tags: importnumpy脚本元素示例过程np矩阵
2条回答

索引后查看形状:

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]是两个索引操作,而不是一个。因此,第二个[0]的效果取决于第一个产生什么。

对于数组A[0,0]相当于A[0,:][0]。但对于矩阵,您需要:

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

一、二、二、三

"An array of itself", but I doubt anyone in their right mind would choose that as a model for matrices in a scientific library.

What is, then, the logic to the output I obtained? Why would the first element of a matrix object be itself?

In addition, A[0,:] is not the same as A[0]

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

A[0]并不意味着“返回第一个元素”。意思是沿着第一个轴选择。表示第一个项目的1d数组。对于二维数组,它表示第一行。对于ndarray来说,它是一个一维数组,而对于matrix来说,它是另一个matrix。所以对于二维数组或矩阵,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。。。。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])

相关问题 更多 >