当前位置:  开发笔记 > 编程语言 > 正文

Numpy中的矩阵索引

如何解决《Numpy中的矩阵索引》经验,为你挑选了1个好方法。

在开发涉及矩阵运算的小型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:我知道如何获得矩阵的第一个条目.我感兴趣的是这个设计决策背后的逻辑.

编辑:我不是问如何访问矩阵元素,或者为什么矩阵行的行为像矩阵.当用单个数字索引时,我要求定义矩阵的行为.这是典型的数组操作,但结果行为与您期望从数组中得到的行为完全不同.我想知道这是如何实现的,以及设计决策背后的逻辑是什么.



1> hpaulj..:

索引后查看形状:

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或更多.

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有