如何在使用numpy时避免循环



我有一个大小为10x250000的numpy数组,我需要在程序中更改它的值,但使用"for循环"让我的程序非常慢。这就是前面提到的程序部分。(L2, L1和T为其他数组):

EEf1=numpy.zeros((10,250000))
for m in range(10):
for n in range(250000):
EEf1[m,n]+=2*(L2[m,0]-T[m,0])*L2[m,0]*(1-L2[m,0])*L1[n,0]

我的问题:有任何解决方案使用numpy特性以避免这个循环?我已经尝试了fromfunction方法如下(例如):

np.fromfunction(lambda i,j : A[i,j]+B[i,j] , (2,2))

(A和B是2x2数组)但这行不通。我真的需要避免这个循环。有人能帮忙吗?

我认为这只是广播,但如果没有可复制的例子,很难进行测试:

EEf1 = 2*(L2[:, 0] - T[:, 0]) * L2[:, 0] * (1 - L2[:, 0]) * L1[None, :, 0]

大多数情况下不需要做什么更改,只需跳过for循环。

这里L1L2的形状不匹配——np.outer在这里起作用:

def my_func(L1, L2, T):
return np.outer(2 * (L2 - T) * L2 * (1 - L2), L1)

此外,L1,L2T不是1D数组开始有点奇怪,因为您只使用它们的第一列。

平等:

M, N = 10, 25_000
L1 = np.random.rand(N, 1)
L2 = np.random.rand(M, 1)
T = np.random.rand(M, 1)
expected = op_func(L1, L2, T)
result = my_func(L1, L2, T)
np.array_equal(result, expected)  # True

性能测试:

>>> %timeit op_func(L1, L2, T)
... %timeit my_func(L1, L2, T)
250 ms ± 2.24 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
85.2 µs ± 191 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

作为函数的代码行,供参考:

def op_func(L1, L2, T):
N, M = L1.shape[0], L2.shape[0]
assert T.shape[0] == M
EEf1 = np.zeros((M, N))
for m in range(M):
for n in range(N):
EEf1[m, n] += (
2 * (L2[m, 0] - T[m, 0]) * L2[m, 0] * (1 - L2[m, 0]) * L1[n, 0]
)
return EEf1

最新更新