输入/输出#
有几种方法可以将数据导入和导出python-graphblas。
从/到值#
Scalar 有 .from_value()
和 .value
来将 Python 标量传入和传出 python-graphblas。
Matrix 和 Vector 相反,有一个 .from_coo()
和一个 .to_coo()
方法。
.from_coo()
接受索引和值作为以下形式:
Python 列表
NumPy 数组
如果没有提供dtype,数据类型将从值中推断出来。
如果没有提供大小(Vector)或行数/列数(Matrix),则根据每个维度找到的最大索引推断形状。
.to_coo()
返回 numpy 数组。索引总是以 uint64
形式返回,而值数组将匹配集合的数据类型。
v = gb.Vector.from_coo([1, 3, 6], [2, 3, 4], float, size=10)
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
---|---|---|---|---|---|---|---|---|---|---|
2.0 |
3.0 |
4.0 |
>>> idx, vals = v.to_coo()
>>> idx
array([1, 3, 6], dtype=uint64)
>>> vals
array([2., 3., 4.])
NetworkX#
可以使用 gb.io.from_networkx()
从 NetworkX 图创建一个 python-graphblas 矩阵。
可以指定dtype和weight标签。还可以提供一个节点列表,以便仅提取NetworkX图的一个子集。
gb.io.to_networkx()
则相反。它总是返回一个带有标记为“weight”权重的有向图。
Scipy.Sparse#
可以使用gb.io.from_scipy_sparse()
从二维的scipy.sparse数组或矩阵创建一个python-graphblas矩阵。
gb.io.to_scipy_sparse()
将输出一个二维的 scipy.sparse 数组,给定一个 python-graphblas 矩阵。
可以指定 scipy.sparse 格式。默认为“csr”。
关于scipy.sparse中零权重边的注意事项: scipy.sparse假设缺失值和零权重边可以同等对待。在scipy.sparse代码库中有一些转换会丢弃零权重边。从python-graphblas到scipy.sparse的转换尝试保留零权重边,但用户应注意当scipy.sparse处理零权重边时可能出现的错误。
PyData.Sparse#
可以使用gb.io.from_pydata_sparse()
从二维(PyData)稀疏数组或矩阵创建python-graphblas矩阵。
gb.io.to_pydata_sparse()
将输出一个二维的(PyData)稀疏数组,给定一个python-graphblas矩阵。
可以指定稀疏格式。默认格式为“coo”。
NumPy (密集)#
虽然对于非常大的图来说并不有用,但转换为小型密集的numpy数组以及从其中转换回来可能是有用的。
Vector.from_dense()
将一维数组转换为 Vector,
Matrix.from_dense()
将二维数组转换为 Matrix。从 numpy 转换时,可以选择一个值作为缺失值,例如 Matrix.from_dense(a, missing_value=0)
。
.to_dense()
将向量或矩阵转换为 numpy 数组。如果有缺失值,应提供一个填充值,例如 .to_dense(fill_value=0)
。
SuiteSparse 导出/导入#
为了尽可能快速地访问python-graphblas中的底层数据结构,SuiteSparse扩展存在于Matrix和Vector集合的.ss
命名空间中。
ss.export()
提供了以特定格式导出的选项,或者保持底层数据结构不变以实现最快的访问。这在序列化图形并通过网络发送时非常有用。
结果是一个包含numpy数组和其他元数据的Python字典。有关更多详细信息,请参阅API参考。
>>> A.ss.export('csr')
{'indptr': array([0, 2, 4, 6], dtype=uint64),
'col_indices': array([0, 2, 1, 2, 0, 2], dtype=uint64),
'sorted_cols': True,
'nrows': 3,
'ncols': 3,
'is_iso': False,
'format': 'csr',
'values': array([10, 20, 30, 40, 50, 60])}
导入需要选择集合并调用
方法。
一个通用的import_any()
方法将检查格式并调用适当的导入器。
否则,可以直接调用特定格式的导入方法名称。
>>> d = A.ss.export('csr')
>>> d["values"][0] = -100 # modify the serialized data
>>> M = gb.Matrix.ss.import_csr(**d)
请注意,在上面的例子中A没有改变。
SuiteSparse 导出有一个 give_ownership
选项。这执行了一个零拷贝移动操作并使原始的 python-graphblas 对象无效。当需要极速或内存太有限无法进行复制时,可能需要此选项。
矩阵市场文件#
Matrix Market 文件格式是一种常见的文件格式,用于以人类可读的ASCII格式存储稀疏数组。Matrix Market 文件——也称为MM文件——通常使用“.mtx”文件扩展名。例如,许多MM格式的数据集可以在SuiteSparse 矩阵集合中找到。
使用 gb.io.mmread()
将 Matrix Market 文件读取为 python-graphblas 矩阵,
并使用 gb.io.mmwrite()
将矩阵写入 Matrix Market 文件。
这些名称与 scipy.sparse 中的等效函数相匹配。
scipy
需要安装才能读取 Matrix Market 文件。
如果安装了 fast_matrix_market
,默认情况下将使用它来获得
更好的性能。