python - Numpy 中的矩阵索引

标签 python numpy matrix

在开发涉及矩阵运算的小型 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/

相关文章:

C++ 重载运算符 [ ][ ]

python - Keras:提前停止模型保存

python - 获取最近几天创建的对象列表(按天分组)

python - forEdges迭代器在networkit中的使用(python)

python - 如何在 python 中创建和销毁独立于操作系统的非阻塞子进程?

python - Pandas 和 numpy 线程安全

python - 基于一列保存数据并由 Pandas 中的另一列命名

c++ - 如何对二维矩阵的行进行排序?

python - python 中共享数组的 RawArray 的最大大小

arrays - 汇总行值的所有排列