在开发涉及矩阵运算的小型 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.matrix
始终是 2d。因此,即使您选择一行 (A[0,:]
),结果仍然是 2d,形状 (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
=============================
"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]
并不意味着“返回第一个元素”。这意味着沿第一个轴选择。对于表示第一项的一维数组。对于二维数组,它表示第一行。对于 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
它可能具有相同的数据、形状和步幅,但它是一个新对象。它与多行矩阵的第 第
行一样独特。
大多数独特的 matrix
事件定义在:numpy/matrixlib/defmatrix.py
。我打算建议查看 matrix.__getitem__
方法,但大部分操作都是在 np.ndarray.__getitem__
中执行的。
np.matrix
类已添加到 numpy
以方便老派 MATLAB 程序员使用。 numpy
数组几乎可以有任何维数,0、1、....MATLAB 只允许 2,尽管 2000 年左右的版本将其推广到 2 或更多。
关于python - Numpy 中的矩阵索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34026505/