我对在忽略数组中的某些值时执行数组操作(点、外部、加等)的最佳/最快方法感兴趣。我主要关注一些值(可能是50%-30%)被忽略且是有效地零,同时使用相当大的数组,可能有100,000到1,000,000个元素。我可以考虑许多解决方案,但似乎没有一个能真正从能够忽略某些值的潜在优势中受益。例如:
import numpy as np
A = np.ones((dim, dim)) # the array to modify
B = np.random.random_integers(0, 1, (dim, dim)) # the values to ignore are 0
C = np.array(B, dtype = np.bool)
D = np.random.random((dim, dim)) # the array which will be used to modify A
# Option 1: zero some values using multiplication.
# some initial tests show this is the fastest
A += B * D
# Option 2: use indexing
# this seems to be the slowest
A[C] += D[C]
# Option 3: use masked arrays
A = np.ma.array(np.ones((dim, dim)), mask = np.array(B - 1, dtype = np.bool))
A += D
编辑1:
正如cyborg所建议的,稀疏数组可能是另一种选择。不幸的是,我对该包不太熟悉,无法获得可能会有的速度优势。例如,如果我有一个由稀疏矩阵A
定义的限制连通性的加权图,另一个定义连通性(1 = 连通,0 = 不连通)的稀疏矩阵B
和一个密集的numpy矩阵C
,我希望能够做类似于A = A + B.multiply(C)
的操作,并利用A
和B
的稀疏性。
A += B.multiply(C)
是正确的做法。你为什么说你没有优势? - cyborgB
是稀疏的并且C
是稠密的,B.multiply(C)
将会是一个稠密矩阵。我想使用稀疏矩阵的任何好处都将被转换结果回到稀疏矩阵的成本所抵消,然后再加到A
中。也许有更好的方法,但是我不太熟悉 scipy.sparse。另外我的语法是错误的。在scipy中,+=
未定义为稀疏矩阵,应该是A = A + B.multiply(C)
。 - altoscipy.sparse.coo_matrix
扩展的说明。 - cyborg