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

时间:2012-05-19 21:16:45

标签: python numpy scipy sparse-matrix

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

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

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

3 个答案:

答案 0 :(得分:10)

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

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

你想要的是来自numpy的X!=0方法。

nonzero

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

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 :(得分:1)

这看起来很像,虽然效率不高:

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

答案 2 :(得分:0)

也可以使用     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]]