在一个涉及矩阵操作的小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中的矩阵索引。这种行为对于我称之为“自身数组”的东西来说是有意义的,但我怀疑任何头脑正常的人都会选择它作为科学图书馆中矩阵的模型。
那么,我得到的输出的逻辑是什么?为什么矩阵对象的第一个元素是它自己?
我知道如何得到矩阵的第一个项。我感兴趣的是这个设计决策背后的逻辑。
编辑:我不是问如何访问矩阵元素,或者为什么矩阵行的行为像矩阵。我要求一个定义,当一个矩阵的行为与一个单一的数字索引。这是一个典型的数组行为,但其结果与您期望的数组行为完全不同。我想知道这是如何实现的,以及设计决策背后的逻辑是什么。
索引后查看形状:
这种行为的关键是
np.matrix
始终是2d,所以即使选择一行(A[0,:]
),结果仍然是2d,shape(1,3)
。所以你可以随心所欲地多串几个[0]
,而且不会有什么新的事情发生。你想用
A[0][0]
来完成什么?与A[0,0]
相同? 对于基类np.ndarray
来说,它们是等价的。注意,
Python
解释器将索引转换为__getitem__
调用。[0][0]
是两个索引操作,而不是一个。因此,第二个[0]
的效果取决于第一个产生什么。对于数组
A[0,0]
相当于A[0,:][0]
。但对于矩阵,您需要:一、二、二、三
鉴于这些评论,让我提出一些澄清意见。
A[0]
并不意味着“返回第一个元素”。意思是沿着第一个轴选择。表示第一个项目的1d数组。对于二维数组,它表示第一行。对于ndarray
来说,它是一个一维数组,而对于matrix
来说,它是另一个matrix
。所以对于二维数组或矩阵,A[i,:]
和A[i]
是一样的。A[0]
不只是返回本身。它返回一个新矩阵。不同的id
:它可能有相同的数据,形状和步幅,但它是一个新的对象。它和多行矩阵的
ith
行一样唯一。大多数唯一的
matrix
活动在:numpy/matrixlib/defmatrix.py
中定义。我本打算建议查看matrix.__getitem__
方法,但大多数操作是在np.ndarray.__getitem__
中执行的。np.matrix
类被添加到numpy
中,以方便老式的MATLAB程序员。numpy
数组几乎可以有任意数量的维度,0,1。。。。MATLAB只允许2个,尽管2000年左右的一个版本将其概括为2个或更多。假设你有
如果要获取第二列值,请使用以下命令:
相关问题 更多 >
编程相关推荐