我知道scipy.sparse.find(A)
返回3个数组I,J,V,每个数组分别包含非零元素的行,列和值。
我想要的是为所有零元素做同样的事情(除了V数组)而不必遍历矩阵,因为它太大了。
答案 0 :(得分:0)
假设你有一个scipy稀疏数组并导入了class CoreView(CoreMixin,TemplateView):
pass
class BaseView(CoreView):
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
do_dispatch(self, request, *args, **kwargs)
return super(BaseView, self).dispatch(request, *args, **kwargs)
def do_dispatch(self, request, *args, **kwargs):
# This is the method we'll override
pass
class MyView(BaseView):
def do_dispatch(self, request, *args, **kwargs):
"Do Stuff"
:
find
答案 1 :(得分:0)
制作一个稀疏矩阵为10%的小稀疏矩阵:
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>
10个非零值:
In [5]: sparse.find(M)
Out[5]:
(array([6, 4, 1, 2, 3, 0, 1, 6, 9, 6], dtype=int32),
array([1, 2, 3, 3, 3, 4, 4, 4, 5, 8], dtype=int32),
array([ 0.91828586, 0.29763717, 0.12771201, 0.24986069, 0.14674883,
0.56018409, 0.28643427, 0.11654358, 0.8784731 , 0.13253971]))
如果矩阵的100个元素中有10个非零,则90个元素为零。你真的想要所有这些指数吗?
密集等价物上的 where
或nonzero
给出相同的索引:
In [6]: A = M.A # dense
In [7]: np.where(A)
Out[7]:
(array([0, 1, 1, 2, 3, 4, 6, 6, 6, 9], dtype=int32),
array([4, 3, 4, 3, 3, 2, 1, 4, 8, 5], dtype=int32))
90个零值的指数:
In [8]: np.where(A==0)
Out[8]:
(array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9], dtype=int32),
array([0, 1, 2, 3, 5, 6, 7, 8, 9, 0, 1, 2, 5, 6, 7, 8, 9, 0, 1, 2, 4, 5, 6,
7, 8, 9, 0, 1, 2, 4, 5, 6, 7, 8, 9, 0, 1, 3, 4, 5, 6, 7, 8, 9, 0, 1,
2, 3, 4, 5, 6, 7, 8, 9, 0, 2, 3, 5, 6, 7, 9, 0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 6, 7, 8, 9], dtype=int32))
这是2个形状(90,),180个整数的数组,而不是密集数组本身的100个值。如果您的稀疏矩阵太大而无法转换为密集,那么它将太大而无法生成所有零指数(假设合理的稀疏度)。
print(M)
显示与查找相同的三元组。 coo
格式的属性也给出了非零索引:
In [13]: M.row
Out[13]: array([6, 6, 3, 4, 1, 6, 9, 2, 1, 0], dtype=int32)
In [14]: M.col
Out[14]: array([1, 4, 3, 2, 3, 8, 5, 3, 4, 4], dtype=int32)
(有时矩阵的操作可以将值设置为0而不从属性中删除它们。所以find/nonzero
需要额外的步骤来删除它们(如果有的话)。)
我们也可以将find
应用于M==0
- 但稀疏会给我们一个警告。
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)
我一直警告的是同样的事情 - 这套装置的大尺寸。结果数组与Out [8]相同。