【发布时间】:2017-08-21 11:33:31
【问题描述】:
假设我有 4 个 numpy 数组 A,B,C,D ,每个数组的大小为 (256,256,1792)。 我想遍历这些数组的每个元素并对它做一些事情,但是我需要以 256x256x256 立方体的块来做。
我的代码如下所示:
for l in range(7):
x, y, z, t = 0,0,0,0
for m in range(a.shape[0]):
for n in range(a.shape[1]):
for o in range(256*l,256*(l+1)):
t += D[m,n,o] * constant
x += A[m,n,o] * D[m,n,o] * constant
y += B[m,n,o] * D[m,n,o] * constant
z += C[m,n,o] * D[m,n,o] * constant
final = (x+y+z)/t
doOutput(final)
代码可以正常工作并输出我想要的内容,但速度非常慢。我在网上读到,在 python 中应该避免那种嵌套的 for 循环。什么是最干净的解决方案? (现在我正在尝试在 C 中完成这部分代码,并以某种方式通过 Cython 或其他工具导入它,但我喜欢纯 python 解决方案)
谢谢
添加
Willem Van Onsem 对第一部分的解决方案似乎工作得很好,我想我理解它。但现在我想在对它们求和之前修改我的值。好像
(在外 l 循环内)
for m in range(a.shape[0]):
for n in range(a.shape[1]):
for o in range(256*l,256*(l+1)):
R += (D[m,n,o] * constant * (A[m,n,o]**2
+ B[m,n,o]**2 + C[m,n,o]**2)/t - final**2)
doOutput(R)
我显然不能只求和 x = (A[:a.shape[0],:a.shape[1],256*l:256*(l+1)]*Dsub).sum()**2*constant 的平方,因为 (A²+B²) != (A+B)²
我怎样才能重做这个最后的 for 循环?
【问题讨论】:
-
你会用
x,y,z,t做什么?在这里你只重置它们,所以只有最后一个循环 (l = 6) 才是真正重要的...... -
这只是我代码的一小部分。我稍后会使用这些总结值
-
这可能是一个愚蠢的问题,但由于您只是逐项添加,因此您不需要分成正方形部分。我好像是
t=np.sum(D)和x=np.sum(A*D),除非你真的想做np.dot(A[:256],D[:256])之类的事情 -
@DanielForsman:问题表明 OP 希望处理 256x256x256 的 块。
-
@t.rathjen:“修改我的价值观”是什么意思。你不修改任何一个,你只是总结它们。
标签: python arrays numpy for-loop