In [1]: from scipy import sparse
In [2]: M = sparse.random(10,10,.1)
In [3]: M
Out[3]:
<10x10 sparse matrix of type '<class 'numpy.float64'>'
with 10 stored elements in COOrdinate format>
In [15]: sparse.find(M==0)
/usr/local/lib/python3.5/dist-packages/scipy/sparse/compressed.py:213: SparseEfficiencyWarning: Comparing a sparse matrix with 0 using == is inefficient, try using != instead.
", try using != instead.", SparseEfficiencyWarning)
from itertools import product
I, J, _= find(your_sparse_array)
nonzero = zip(I, J)
nrows, ncols = your_sparse_array.shape
for a, b in product(range(nrows), range(ncols)):
if (a,b) not in nonzero: print(a, b)
3条答案
按热度按时间z0qdvdin1#
创建一个稀疏度为10%的小稀疏矩阵:
10个非零值:
如果在矩阵的100个元素中,有10个非零,那么有90个元素为零,你真的想要所有这些元素的索引吗?
where
或nonzero
在稠密等价物上给出相同的指数:以及90个零值的指数:
这是2个shape(90,)数组,180个整数,而不是密集数组本身的100个值。如果稀疏矩阵太大而无法转换为密集矩阵,那么它将太大而无法生成所有的零索引(假设合理的稀疏性)。
print(M)
显示了与find相同的三元组,coo
的属性也给予了非零索引:(有时,矩阵的操作可以将值设置为0,而不会将其从属性中移除。因此,
find/nonzero
需要额外的步骤来移除这些值(如果有的话)。)我们也可以将
find
应用于M==0
-但是稀疏会给予我们一个警告。这和我之前警告过的是一样的--这个集合太大了。结果数组和Out[8]中的一样。
ql3eal8s2#
下面是我找到零值索引的解决方案:
例如:
你会得到非零的索引:
然后找到零索引:
您将获得:
矩阵的密集格式为:
rqmkfv5c3#
假设您有一个scipy稀疏数组并导入了
find
: