问题 如何有效地从仅包含零的稀疏矩阵中删除列?


从仅包含零的稀疏矩阵中有效删除列的最佳方法是什么。我有一个矩阵,我已经创建并填充了数据:

matrix = sp.sparse.lil_matrix((100, 100))

我现在希望删除〜最后20列只包含零数据的列。我怎样才能做到这一点?


11139
2018-05-19 21:16


起源

你是否致力于使用lil_matrix?根据scipy文档,它对列切片效率不高 - 您可能会考虑使用csc_matrix。看到: docs.scipy.org/doc/scipy/reference/generated/... 和 docs.scipy.org/doc/scipy/reference/generated/... - Edward Loper
谢谢您的帮助。是的,csr或csc也没关系。 - turtle
@turtle做了这个回答你的问题? - gabe


答案:


如果这只是一个numpy数组, X那么你可以说 X!=0 这会给你一个形状相同的布尔数组 X,然后你可以索引 X 使用布尔数组,即 non_zero_entries = X[X!=0]

但这是一个稀疏矩阵,它不支持布尔索引,如果你尝试也不会给你你想要的东西 X!=0  - 它只返回一个布尔值,如果它们是完全相同的矩阵(在内存中),它似乎只返回true。

你想要的是什么 nonzero 来自numpy的方法。

import numpy as np
from scipy import sparse

X = sparse.lil_matrix((100,100)) # some sparse matrix
X[1,17] = 1
X[17,17] = 1
indices = np.nonzero(X) # a tuple of two arrays: 0th is row indices, 1st is cols
X.tocsc()[indices] # this just gives you the array of all non-zero entries

如果您只想要存在非零条目的完整列,那么只需从索引中获取第1列。除非您需要考虑重复索引(如果列中有多个条目):

columns_non_unique = indices[1]
unique_columns = sorted(set(columns_non_unique))
X.tocsc()[:,unique_columns]

9
2017-11-15 19:03



我使用以下内容仅提取具有非零条目的列: matrix[:,np.unique(alldata.nonzero()[1])] - canzar
这很好,很紧凑。几乎相同,除了你使用numpy的独特而不是 sorted(set(columns))。 - gabe
为了清楚起见,大多数稀疏矩阵都有 .nonzero 方法以相同的方式工作,并且比它快得多 np.nonzero(sparse_matrix)。尽管有帮助的答案。 - Robert E Mealey


这看起来像是方式,虽然效率不理想:

matrix = matrix[0:100,0:80]

1
2018-05-19 21:32



不幸的是,零列的数量并不总是固定的。我需要一种方法来做到这一点,如果有35个零列或10个零列,程序仍然可以工作。 - turtle


人们也可以使用      scipy.sparse.find() 获取稀疏矩阵中所有非零元素的位置。

[1]返回值中的条目是一个numpy列数列。从此数组中获取唯一值将给出非零列的索引。通过这些列对原始稀疏矩阵进行子集化可以得到非零列。

x[:,np.unique(sparse.find(x)[1])]

可以将其扩展为查找列 至少n 项:

idx = np.unique(sparse.find(x)[1], return_counts=True)
x[:, idx[0][idx[1] > n]]

0
2018-05-17 10:39