曼查克 发表于 2023-8-28 17:11:39

求大神指点!三维矩阵怎么转稀疏矩阵并保存成文件?

找了一天了,from scipy.sparse import coo_matrix只支持二维矩阵的稀疏,实在找不到三维矩阵稀疏的办法,另外还需要保存成文件供后续使用。

陶远航 发表于 2023-8-28 17:12:09

将三维矩阵转换为稀疏矩阵并保存成文件可以通过以下步骤实现:

1. 导入所需的库:numpy 和 scipy.sparse。

2. 将三维矩阵表示为稀疏矩阵的形式。由于 scipy.sparse 库只支持二维矩阵的稀疏表示,我们可以使用 scipy.sparse.dok_matrix 类来创建一个字典型稀疏矩阵。

3. 遍历三维矩阵中的每个元素,并将非零元素添加到稀疏矩阵中。

4. 使用 coo_matrix 函数将字典型稀疏矩阵转换为压缩稀疏矩阵(COO 格式)。

5. 通过调用 tofile 方法将压缩稀疏矩阵保存到文件。

下面是一个示例代码,演示了如何将三维矩阵转换为稀疏矩阵并保存成文件:

import numpy as np
from scipy.sparse import coo_matrix

# 创建三维矩阵
matrix_3d = np.array([
    [, , ],
    [, , ],
    [, , ]
])

# 获取三维矩阵的形状
m, n, p = matrix_3d.shape

# 创建字典型稀疏矩阵
sparse_matrix = {}
for i in range(m):
    for j in range(n):
      for k in range(p):
            if matrix_3d != 0:
                sparse_matrix[(i, j, k)] = matrix_3d

# 转换为压缩稀疏矩阵(COO 格式)
coo_sparse_matrix = coo_matrix((list(sparse_matrix.values()), zip(*sparse_matrix.keys())), shape=(m, n, p))

# 将稀疏矩阵保存到文件
coo_sparse_matrix.tofile("sparse_matrix.bin")


在此示例中,我们首先创建了一个 3x3x3 的三维矩阵 matrix_3d。然后,我们将 matrix_3d 转换为一个字典型稀疏矩阵 sparse_matrix,其中字典的键是非零元素的坐标,值是非零元素的值。最后,使用 coo_matrix 函数将字典型稀疏矩阵转换为压缩稀疏矩阵,并将其保存到文件 "sparse_matrix.bin" 中。

请注意,在此示例中,压缩稀疏矩阵使用二进制格式保存到文件。如果需要保存为其他格式,可以使用不同的函数和参数,比如 toarray 方法保存为文本格式。

希望对你有所帮助!如果你有任何其他问题,请随时提问。
如果问题已经解决,请设置最佳答案

isdkz 发表于 2023-8-28 17:12:30

对于三维矩阵的稀疏表示,可以使用 scipy.sparse 库中的 dok_matrix 类。 dok_matrix 类是一个字典类型的稀疏矩阵,可以方便地构建和修改稀疏矩阵。

下面是一个示例代码,演示如何将三维矩阵转换为稀疏矩阵,并将其保存到文件中:

import numpy as np
from scipy.sparse import dok_matrix

# 创建一个三维矩阵
matrix = np.random.randint(0, 10, size=(3, 3, 3))

# 将三维矩阵转换为稀疏矩阵
sparse_matrix = dok_matrix(matrix.shape, dtype=np.int32)
for i in range(matrix.shape):
    for j in range(matrix.shape):
      for k in range(matrix.shape):
            if matrix != 0:
                sparse_matrix = matrix

# 将稀疏矩阵保存到文件
np.savez('sparse_matrix.npz', data=sparse_matrix.data, indices=sparse_matrix.indices, indptr=sparse_matrix.indptr, shape=sparse_matrix.shape)


这段代码首先创建了一个三维矩阵,然后使用 dok_matrix 类创建了一个空的稀疏矩阵。接着,通过遍历三维矩阵的每个元素,将非零元素添加到稀疏矩阵中。最后,使用 np.savez 函数将稀疏矩阵的数据、索引和形状保存到文件中。

保存的文件是一个压缩的 npz 文件,可以使用 np.load 函数加载该文件并恢复稀疏矩阵的表示。

希望对你有所帮助!如有其他问题,请随时提问。

曼查克 发表于 2023-8-28 17:13:48

陶远航 发表于 2023-8-28 17:12
将三维矩阵转换为稀疏矩阵并保存成文件可以通过以下步骤实现:

1. 导入所需的库:numpy 和 scipy.sparse ...

我靠大佬你好快!等我仔细瞧瞧!

曼查克 发表于 2023-8-28 17:29:04

陶远航 发表于 2023-8-28 17:12
将三维矩阵转换为稀疏矩阵并保存成文件可以通过以下步骤实现:

1. 导入所需的库:numpy 和 scipy.sparse ...

大佬,再请教一下
1.    coo_sparse_matrix = coo_matrix((list(sparse_matrix.values()), zip(*sparse_matrix.keys())), shape=(m, n, p))
这句报错了
TypeError: invalid input format


2.保存为.bin文件的话我怎么用他,怎么转换为原来的密度矩阵?

陶远航 发表于 2023-8-28 17:30:21

曼查克 发表于 2023-8-28 17:29
大佬,再请教一下
1.
这句报错了


3楼答案更准确

曼查克 发表于 2023-8-28 17:32:01

isdkz 发表于 2023-8-28 17:12
对于三维矩阵的稀疏表示,可以使用 scipy.sparse 库中的 dok_matrix 类。 dok_matrix 类是一个字典类型的稀 ...

大佬,试了一下你这个方法,报错了
sparse_matrix = dok_matrix(seg.shape, dtype=np.int32)
TypeError: Expected rank <=2 dense array or matrix.

曼查克 发表于 2023-8-28 17:33:49

陶远航 发表于 2023-8-28 17:30
3楼答案更准确

好的,谢谢!

曼查克 发表于 2023-8-28 17:38:42

陶远航 发表于 2023-8-28 17:12
将三维矩阵转换为稀疏矩阵并保存成文件可以通过以下步骤实现:

1. 导入所需的库:numpy 和 scipy.sparse ...

啊,好像三楼的办法也不行,也是只能支持2维的
报错:TypeError: Expected rank <=2 dense array or matrix.

陶远航 发表于 2023-8-28 17:39:50

曼查克 发表于 2023-8-28 17:38
啊,好像三楼的办法也不行,也是只能支持2维的
报错:TypeError: Expected rank

好吧,那我就不知道了,这个东西没咋学

wcb11 发表于 2024-9-2 15:33:00

请问现在您解决这个问题了吗?我也需要将一个三维矩阵变成稀疏的三维矩阵
页: [1]
查看完整版本: 求大神指点!三维矩阵怎么转稀疏矩阵并保存成文件?