1

我发现 Python、numpy 或 matplotlib 的一个奇怪行为。

请在 ipython 上使用 pylab 执行以下代码:

>>> import numpy as np
>>> import numpy.random as nr
>>> import matplotlib.pyplot as mp
>>> data = nr.rand(50, 2)
>>> mp.scatter(data[:, 0], data[:, 1])
>>> trans = np.asmatrix(data.T)
>>> mp.scatter(trans[0, :], trans[1, :])
>>> all(data == trans.T)

我预计此代码创建的两个图形完全相同,但它们看起来略有不同。代码的最后一行也暗示它们完全相同。

问题是什么?

python 2.7.4,IPython 0.13.2,pylab 1.7.1,numpy 1.7.1,matplotlib 1.2.0

4

1 回答 1

0

如果适用,np.asmatrix()只需将可迭代对象转换为矩阵。所以:

 trans = np.asmatrix(data.T)
 np.all( data == trans.T )

应该总是给True

不同图的问题在于在matplotlib.axes.Axes.scatter(Masked Arrays)模块ravel()中执行。numpy.ma尽管data==trans.T,这里np.ma.ravel(trans[0,:])返回一个矩阵而不是一个扁平数组。要解决这个问题,您可以调用np.ravel(),这适用于非屏蔽数组。我在 GitHub 中打开了这个问题来报告这个问题,这可能是一个错误......

结果将是:

fig, axs = mp.subplots(nrows=1, ncols=2, sharey=True )

axs[0].scatter(data[:, 0], data[:, 1])

trans = np.asmatrix(data.T)

axs[1].scatter( np.ravel(trans[0,:]), np.ravel(trans[1,:]) )

fig.tight_layout()

给你这个:

在此处输入图像描述

于 2013-06-19T11:16:14.800 回答