Scipy相当于MATLAB中的spy函数。

16

我一直在将一个isomap算法的代码从MATLAB移植到Python。我尝试使用spy函数可视化稀疏模式。

MATLAB命令:

spy(sparse(A));
drawnow;

Python 命令:

matplotlib.pyplot.spy(scipy.sparse.csr_matrix(A))
plt.show()

使用上面的命令,我无法在Python中复现MATLAB的结果。仅使用非稀疏格式中的A执行该命令可以给出与MATLAB相似的结果。但是需要很长时间(A为2000x2000)。Scipy中一个sparse函数的MATLAB等效函数是什么?

4个回答

20

也许是你的matplotlib版本出了问题,对我来说scipy.sparsematplotlib.pylab可以很好地配合使用。

请参考下面的示例代码,它会生成附带的'spy'图。

import matplotlib.pylab as plt
import scipy.sparse as sps
A = sps.rand(10000,10000, density=0.00001)
M = sps.csr_matrix(A)
plt.spy(M)
plt.show()

# Returns here '1.3.0'
matplotlib.__version__

这产生了这个图: 输入图像描述


谢谢。我发现错误在于我的Python代码中创建A矩阵的部分。一个快速的问题。生成的蓝色方块是非零元素,对吗? - Nitin

8
我刚刚发布了 betterspy,它在这方面可能做得更好。安装方式如下:
pip install betterspy

并运行

import betterspy
from scipy import sparse

A = sparse.rand(20, 20, density=0.1)
betterspy.show(A)
betterspy.write_png("out.png", A)

enter image description here


这似乎是Matplotlib的一个不错的补充。是否可以在betterspy.show()中使用轴属性,例如ax.set_xticklabels(...)?顺便说一下,做得很好。 - Traxidus Wolf
只需使用 betterspy.plot(A),在 gca() 上设置所需内容,然后 pyplot.show() 显示图像即可。 - Nico Schlömer
哦,太棒了,运作得很好。自读文档上没有看到这个方法。我建议在文档中进行改进。谢谢。@Nitin 这应该是被采纳的答案。以下是一个快速示例:import matplotlib.pyplot as plt, betterspy as bspy, scipy.sparse as sps; A=sps.rand(5,5, density=.4); bspy.plot(A); ax=plt.gca(); ax.set_xticklabels(['','a','b','c','d','e']); plt.show() - Traxidus Wolf

6

使用较小的标记:

import matplotlib.pylab as pl
import scipy.sparse as sps
import scipy.io
import sys
A=scipy.io.mmread(sys.argv[1])
pl.spy(A,precision=0.01, markersize=1)
pl.show()

1
查看matspy
pip install matspy

大矩阵不是问题,一个数值非零元素达到数百万的间谍情节只需要不到半秒钟。一个小例子:
from matspy import spy
import scipy

n = 9000
A = scipy.sparse.random(n, n, density=0.001) + scipy.sparse.eye(n)

spy(A)

matspy output

如果你想进一步修改图形,可以使用fig, ax = matspy.spy_to_mpl(A)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接