scipy 行和列数组之间的有效成对比较

aelbi1ox  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(134)

给定一个行向量a = np.array([1, 2, 3])和一个列向量b = np.array([[1], [2], [3]]),我们可以通过执行c = a==b来逐个比较所有元素,该函数返回

>>> c
array([[ True, False, False],
       [False,  True, False],
       [False, False,  True]])

然而,当元素的数量非常大时,这需要大量的存储器。是否可以使用下面的稀疏矩阵ab,并高效地计算稀疏矩阵c

from scipy.sparse import csr_matrix
data = np.array([1, 2, 3])
row = np.array([0, 1, 2])
col = np.array([0, 0, 0])

a = csr_matrix((data, (row, col)), shape=(3, 1))
b = csr_matrix((data, (col, row)), shape=(1, 3))
j91ykkif

j91ykkif1#

为了加快a==B的速度,你可以使用numexpr.evaluate('a==b'),但是这不会消除内存负担。
相反,您可以储存的索引,其中a==B为True:

In [5]: import numexpr

In [6]: import numpy as np

In [7]: a = np.array([1, 2, 3,4])

In [8]: b = np.array([[1], [3], [5]])

In [9]: np.where(numexpr.evaluate('a==b'))  # this consumes the memory
Out[9]: (array([0, 1]), array([0, 2]))  # note, this is rows, cols

In [10]: for col,aval in enumerate(a):  # this will be a lighter memory burdern
    ...:     rows = np.where(aval==b)[0]
    ...:     if not rows.size:
    ...:         continue
    ...:     for row in rows:
    ...:         print (row, col)
    ...: 
0 0
1 2

为清楚起见:

In [14]: a==b
Out[14]: 
array([[ True, False, False, False],
       [False, False,  True, False],
       [False, False, False, False]])

相关问题