我有一个大小为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循环。
这里L1
和L2
的形状不匹配——np.outer
在这里起作用:
def my_func(L1, L2, T):
return np.outer(2 * (L2 - T) * L2 * (1 - L2), L1)
此外,L1
,L2
和T
不是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