在开发涉及矩阵运算的小型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
=============================
"一系列自己",但我怀疑任何心智正常的人都会选择它作为科学图书馆中矩阵的模型.
那么,我获得的输出的逻辑是什么?为什么矩阵对象的第一个元素本身呢?
另外,A [0,:]与A [0]不同
鉴于这些评论,请允许我提出一些澄清.
A[0]
并不意味着'返回第一个元素'.这意味着沿第一轴选择.对于1d数组,表示第1项.对于2d数组,它表示第1行.因为ndarray
那将是一个1d数组,但对于matrix
它是另一个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,...... MATLAB只允许2,尽管2000左右的版本将其推广到2或更多.