设置
我知道,在.sparse-module中,稀疏矩阵与numpy-arrays不同。另外,我知道像here这样的关于稀疏数组切片的问题。无论如何,这个问题和大多数其他问题都涉及切片的性能。
我的问题是如何处理他们不同的切片行为。让我们创建一个示例:
import numpy as np
from scipy import sparse
matrix = np.asarray([[0,0,0,1], [1,1,0,0], [1,0,1,0], [1,0,0,1], [1,0,0,1], [1,0,0,1]])
sparse_matrix = sparse.lil_matrix(matrix) # Or another format like .csr_matrix etc.在这种情况下,应用相同的切片会产生不同的输出:
matrix[:, 3]
# Output:
# array([ True, False, False, True, True, True], dtype=bool)
sparse_matrix[:, 3]
# Output:
# matrix([[ True],
# [False],
# [False],
# [ True],
# [ True],
# [ True]], dtype=bool)问题
这有点令人沮丧,因为我需要第一个输出来应用到第二个例子中。正如一开始所说的,我知道使用sparse_matrix.A等会给我想要的结果。无论如何,将稀疏矩阵转换为数组与稀疏矩阵的初始用例相矛盾.
那么,在不将sparse-matrix转换为数组的情况下,是否有可能实现相同的切片结果?
编辑:用于澄清,因为我的问题在这方面可能会混淆:sparse_matrix上的切片应该具有与matrix相同的输出,这意味着类似于sparse_matrix[:, 3]的东西将输出([ True, False, False, True, True, True])。
发布于 2019-07-22 15:27:48
In [150]: arr = np.asarray([[0,0,0,1], [1,1,0,0], [1,0,1,0], [1,0,0,1], [1,0,0,1], [1,0,0,1]])
...: M = sparse.lil_matrix(arr) # Or another format like .csr_matrix etc. ndarray上的标量索引将维数减少一个:
In [151]: arr[:,3]
Out[151]: array([1, 0, 0, 1, 1, 1])它不改变稀疏矩阵的维数。
In [152]: M[:,3]
Out[152]:
<6x1 sparse matrix of type '<class 'numpy.int64'>'
with 4 stored elements in LInked List format>这种行为类似于np.matrix子类(和MATLAB)。稀疏矩阵总是2d。
此矩阵的密集数组显示:
In [153]: M[:,3].A
Out[153]:
array([[1],
[0],
[0],
[1],
[1],
[1]], dtype=int64)np.matrix显示器:
In [154]: M[:,3].todense()
Out[154]:
matrix([[1],
[0],
[0],
[1],
[1],
[1]], dtype=int64)np.matrix具有一个A1属性,该属性生成一个一维数组(它将转换为ndarray并应用ravel):
In [155]: M[:,3].todense().A1
Out[155]: array([1, 0, 0, 1, 1, 1], dtype=int64)ravel、squeeze和标量索引都是减少ndarray维度的方法。但它们并不直接在np.matrix或稀疏矩阵上工作。
另一个2d稀疏矩阵的例子:
In [156]: sparse.lil_matrix(arr[:,3])
Out[156]:
<1x6 sparse matrix of type '<class 'numpy.int64'>'
with 4 stored elements in LInked List format>
In [157]: _.A
Out[157]: array([[1, 0, 0, 1, 1, 1]], dtype=int64)注意[[...]]。sparse在一维ndarray中增加了一个领先的尺寸1维。
https://stackoverflow.com/questions/57144762
复制相似问题