鱼C论坛

 找回密码
 立即注册
查看: 2099|回复: 10

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

[复制链接]
发表于 2023-8-28 17:11:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
找了一天了,from scipy.sparse import coo_matrix只支持二维矩阵的稀疏,实在找不到三维矩阵稀疏的办法,另外还需要保存成文件供后续使用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-28 17:12:09 | 显示全部楼层
将三维矩阵转换为稀疏矩阵并保存成文件可以通过以下步骤实现:

1. 导入所需的库:numpyscipy.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([
    [[1, 0, 0], [0, 2, 0], [0, 0, 3]],
    [[4, 0, 0], [0, 5, 0], [0, 0, 6]],
    [[7, 0, 0], [0, 8, 0], [0, 0, 9]]
])

# 获取三维矩阵的形状
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[i, j, k] != 0:
                sparse_matrix[(i, j, k)] = matrix_3d[i, j, k]

# 转换为压缩稀疏矩阵(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 方法保存为文本格式。

希望对你有所帮助!如果你有任何其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[0]):
    for j in range(matrix.shape[1]):
        for k in range(matrix.shape[2]):
            if matrix[i, j, k] != 0:
                sparse_matrix[i, j, k] = matrix[i, j, k]

# 将稀疏矩阵保存到文件
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 函数加载该文件并恢复稀疏矩阵的表示。

希望对你有所帮助!如有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-28 17:13:48 | 显示全部楼层
陶远航 发表于 2023-8-28 17:12
将三维矩阵转换为稀疏矩阵并保存成文件可以通过以下步骤实现:

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

我靠大佬你好快!等我仔细瞧瞧!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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文件的话我怎么用他,怎么转换为原来的密度矩阵?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-28 17:30:21 | 显示全部楼层
曼查克 发表于 2023-8-28 17:29
大佬,再请教一下
1.
这句报错了

3楼答案更准确
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-28 17:33:49 | 显示全部楼层

好的,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-28 17:38:42 | 显示全部楼层
陶远航 发表于 2023-8-28 17:12
将三维矩阵转换为稀疏矩阵并保存成文件可以通过以下步骤实现:

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

啊,好像三楼的办法也不行,也是只能支持2维的
报错:TypeError: Expected rank <=2 dense array or matrix.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好吧,那我就不知道了,这个东西没咋学
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-2 15:33:00 | 显示全部楼层
请问现在您解决这个问题了吗?我也需要将一个三维矩阵变成稀疏的三维矩阵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 19:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表