问题 1
我有四个长度相等的列表:A_old、A_new、B_old、B_new
并且希望具有以下行为:如果A_new[i] > A_old[i]
然后设置B_old[i] = B_new[i]
。
尝试了简单的循环实现:
for i, (a_new, a_old) in enumerate(izip(A_new, A_old)):
if a_new > a_old:
B_old[i] = B_new[i]
以及使用 map 的实现(如建议 here ):
B_old = map(lambda (a_new, a_old, b_new, b_old): b_new if a_new > a_old else b_old,
izip(A_new, A_old, B_new, B_old))
但是这些方法都不够快。请注意,我无法使用 numpy
数组和 bool 数组,因为 B_new、B_old
的元素不是数字。
为了让事情更加正式,这里提供了一个示例实现:https://gist.github.com/1986588运行时间如下所示:
Naive: 1.13343191147
Mapping: 1.45240283012
kev: 1.09499907494
Numpy: 0.0525879859924
Where: 0.0651860237122
问题2
评估了不同的选项 numpy
使用 bool 数组进行切片似乎是可行的方法。然而,我现在遇到了一个新问题:
让B_new
不是一个数组,而只是一个值val
。那么最佳变体为
B_old[A_new > A_old] = val
只要 val
不可迭代,此方法就可以正常工作,但当可迭代时就会失败。特别是,val
在这里是一个元组。我想将元组 val
分配给 B_old
的元素,其中 A_new > A_old
。
解决方法似乎是让
val2 = np.empty(1, dtype=object)
val2[0]=val
B_old[A_new > A_old] = val
但这看起来很复杂。问题是我不知道 val 的类型是什么。它可能是可迭代的,也可能不是。
最佳答案
B_old = [B_new[i] if A_new[i]>A_old[i] else B_old[i] for i in range(len(A_old))]
关于python - 基于元素条件合并列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9585072/