索引后查看形状:
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]
是两次索引操作,而不是一次。因此第二个 [0]
的效果取决于第一个产生的结果。
对于一个数组,A[0,0]
等同于 A[0,:][0]
。但对于矩阵,你需要这样做:
In [299]: A[0,:][:,0]
Out[299]: matrix([[1]])
=============================
"它本身的数组",但我怀疑任何理智的人都不会选择它作为科学库中矩阵的模型。
那么,我得到的输出逻辑是什么?为什么一个矩阵对象的第一个元素是它本身?
此外,A [0,:]与A [0]不同
鉴于这些评论,让我提出一些澄清意见。
A [0]
并不意味着“返回第1个元素”。它表示沿着第1轴进行选择。对于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
它可能具有相同的数据、形状和步幅,但它是一个新对象。 它和有许多行的矩阵中的第i行一样独特。
大部分独特的“matrix”活动都在“numpy/matrixlib/defmatrix.py”中定义。我原本想建议查看“matrix.__getitem__”方法,但大部分操作是在“np.ndarray.__getitem__”中执行的。
“np.matrix”类被添加到“numpy”中,作为老派MATLAB程序员的便利。 “numpy”数组可以具有几乎任意数量的维度,0、1…… MATLAB仅允许2个,尽管在2000年左右的版本中将其推广到2个以上。
matrix
类被硬编码为始终具有两个维度(即行和列)。这通过切片和索引操作进行保留(除非您访问单个元素,例如A [0,0]
)。顺便说一句,对于大多数用途,首选ndarray
类(即标准的 numpy 数组);搜索“numpy array vs matrix”以找到有关此主题的大量讨论。 - Warren Weckesser