我正在使用:
给出代码:
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的基础知识(我仍然是它的新手),我很想学习它,这样我就不会花很多时间来调试它。预先非常感谢。
答案 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
。