为什么索引该Numpy矩阵会导致错误?

时间:2019-04-18 21:01:39

标签: python python-3.x numpy matrix

我正在使用:

  • Python 3.5.4
  • Numpy 1.16.2

给出代码:

import numpy as np
num = 3
a = np.asmatrix(np.eye(num, num))
b = np.asmatrix(range(0, num))
print(a[b].transpose())

我得到结果:

[[1.00000000e+000 0.00000000e+000 0.00000000e+000]
 [1.77658241e-307 0.00000000e+000 0.00000000e+000]
 [3.47328271e-310 0.00000000e+000 0.00000000e+000]]

但是通过将b的定义更改为np.asarray(...),或通过执行第二次索引获取列表中的第一项(print(a[b][0].transpose()),我得到了预期的结果:

[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

这是怎么回事?在没有根本原因的线索之前,我还没有遇到过此错误。如果它是Python的基础知识(我仍然是它的新手),我很想学习它,这样我就不会花很多时间来调试它。预先非常感谢。

1 个答案:

答案 0 :(得分:1)

NumPy matrix对象试图确保它们始终为2D,但它们并没有完全完成它。

这样做的时候

b = np.asmatrix(range(0, num))

range(0, num)是一维序列,但是asmatrix创建单行2D矩阵而不是1D对象。 asarray将产生一维数组。

这样做的时候

a[b]

这是一个精美的索引操作,可生成一个 3D 矩阵。 numpy.matrix的对象永远都不应该是3D的,而下面的transpose不知道如何处理它,从而产生荒谬的结果。特别是,由于舍入误差,输出中的奇数几乎为0不会;它们是由于结果矩阵的无意义步幅所致,导致步调不一致,导致内存访问未对齐,并尝试将单独的float片段读取为单个float:

In [13]: a[b].transpose().strides
Out[13]: (1, 24)

在第一个维度上跨度为1字节。


关键要点:不要使用numpy.matrix