即时通讯使用numpy 2d数组。我想将值从一个数组复制到另一个数组,但仅限于表达式为真。
e.g。
for row in range(len(anImage1)):
for col in range(len(anImage1[0])):
if col > 100:
anImage1[row][col] = min(anImage1[row][col], anImage2[row][col])
或
for row in range(len(anImage1)):
for col in range(len(anImage1[0])):
if anImageMask[row][col] == 255:
anImage1[row][col] = anImage2[row][col]
我知道这是一个非常糟糕和缓慢的解决方案......有人可以解释一下如何加快代码的速度吗?
答案 0 :(得分:2)
假设anImage1
和anImage12
是256乘256。
anImage1 = np.random.randint(0, 255, (256, 256))
anImage2 = np.random.randint(0, 255, (256, 256))
只是,第一个条件可以替换为(已更新min
到minimum
。请参阅@ jaime的评论)
anImage1[:, 101:] = np.minimum(anImage1[:, 101:], anImage2[:, 101:], axis=0)
,第二个条件是:
cond = anImage1 == 255
anImage1[cond] = anImage2[cond]
避免循环对于优化numpy
性能非常重要。
答案 1 :(得分:0)
取决于。如果您没有关于数组中条件在何处的信息,那么您别无选择,只能检查数组中每个元素的条件。在那种情况下编写像
这样的代码for i in xrange(len(A)):
for j in xrange(len(A[0])):
if condition(A[i][j])
B[i][j] = A[i][j]
是不可避免的。如果你发现自己在相同条件下重复这样做,你可能会使用诸如存储条件为真的索引之类的技巧,例如。
source = ["a", "b", "c", "a"]
dest = [None]*len(source)
condition = lambda x : x == "a"
indices = [i for i in xrange(len(source)) if condition(source[i])]
for index in indices:
dest[index] = source[index]
希望这有帮助。