根据第三个值将值从numpy数组复制到另一个数组

时间:2014-07-22 07:37:57

标签: python arrays numpy copy expression

即时通讯使用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]

我知道这是一个非常糟糕和缓慢的解决方案......有人可以解释一下如何加快代码的速度吗?

2 个答案:

答案 0 :(得分:2)

假设anImage1anImage12是256乘256。

anImage1 = np.random.randint(0, 255, (256, 256))
anImage2 = np.random.randint(0, 255, (256, 256))

只是,第一个条件可以替换为(已更新minminimum。请参阅@ 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]

希望这有帮助。