Matlab 到 Python 的稀疏矩阵转换,解决零索引问题

3

我在Matlab中有一个N x N稀疏矩阵,其中的单元值由(r,c)对索引,r和c是唯一的id。

问题是,将该矩阵转换为Python后,所有索引值都会减少1。

例如:

Before                     After
(210058,10326) = 1         (210057,10325) = 1

目前,我正在采取以下措施来应对这个问题:

mat_contents = sparse.loadmat(filename)
G = mat_contents['G']
I,J = G.nonzero()
I += 1
J += 1
V = G.data
G = sparse.csr_matrix((V,(I,J)))

我还尝试使用scipy.sparse.io.loadmat中的不同选项{matlab_compatible,mat_dtype},但都没有奏效。

我正在寻找一种解决方案,可以给我与Matlab矩阵相同的索引。不需要重建矩阵的解决方案是理想的,但我也好奇其他人是如何解决这个问题的。


既然Python使用基于0的索引,为什么不在使用Python时进行心理转换呢? - JoshAdel
我想我可以。我对Python还很新。我只是假设这个问题非常普遍,以至于语言中有一些内置功能我没有注意到。 - will
3
我的建议是保持与Python/Numpy/Scipy环境的一致性。如果你在切换到Python后创建了任何数组,它们都将使用从零开始的索引,而所有的方法和切片也都遵循这个规则。起初可能会有些麻烦去适应这种变化,但你会逐渐习惯并避免之后出现的其他问题。 - JoshAdel
能否详细说明您的实际问题。为什么不直接在Python中使用内部0索引,并在需要时将其转换为Matlab处理的1索引(反之亦然)。谢谢。 - eat
我可以进行内部基于0的索引。我想保持索引不变,因为我有一个包含元数据的文件,可以通过用户ID访问。我可能只会重建数据文件,而不必担心在Matlab和Python之间来回切换。谢谢。 - will
你确定稀疏矩阵是解决这个问题的最佳数据结构吗?如果索引表示类似于用户ID之类的东西,那么字典可能是更合适的数据类型 - 但这在很大程度上取决于您想要实现什么。不可否认,将其转换为不同的数据类型需要更多的工作。如果您确实想继续使用稀疏矩阵,为什么不只编写一个简单的包装函数,从每个索引中减去1呢? - DaveP
1个回答

2
感谢大家提供的好建议。
我决定继续使用Python。现在我通过文本文件在Matlab和Python之间进行大多数数据传输。

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