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

tur*_*tle 11 python numpy scipy sparse-matrix

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

matrix = sp.sparse.lil_matrix((100, 100))
Run Code Online (Sandbox Code Playgroud)

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

gab*_*abe 10

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

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

你想要的是nonzeronumpy 的方法.

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
Run Code Online (Sandbox Code Playgroud)

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

columns_non_unique = indices[1]
unique_columns = sorted(set(columns_non_unique))
X.tocsc()[:,unique_columns]
Run Code Online (Sandbox Code Playgroud)

  • 我使用以下内容仅提取具有非零条目的列:`matrix [:,np.unique(alldata.nonzero()[1])]` (3认同)