11

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

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

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

4

3 回答 3

11

如果这只是一个 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

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

columns_non_unique = indices[1]
unique_columns = sorted(set(columns_non_unique))
X.tocsc()[:,unique_columns]
于 2012-11-15T19:03:25.500 回答
1

这看起来像这样,虽然效率不理想:

matrix = matrix[0:100,0:80]
于 2012-05-19T21:32:02.220 回答
0

还可用于 scipy.sparse.find() 获取稀疏矩阵中所有非零元素的位置。

返回值中的第[1]th 个条目是列号的 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]]
于 2017-05-17T10:39:46.083 回答