因此,我基本上是试图在图像处理应用程序的3个并行numpy数组上得到最大值(最小值,或类似的选项)。
问题是,对于给定的数组:
a = [1, 2, 34, 5]
b = [3, 5, 6, 1]
c = [4, 62, 12, 6]我想获得类似的数组,如:
maxArray = [4, 62, 34, 6]其中,每个元素是数组中公共索引的最大值。
有一个明显的方法,经典和天真的编程技术,但我介入了一种矢量化的方式,因为我只是不能把我的头围绕它。
我是不是想错了?你来告诉我。手前谢谢!
发布于 2019-09-05 19:23:51
它将取决于数组的数量和大小,但通常使用functools.reduce和np.maximum将是最好的选择之一,因为它避免了相对昂贵的数组堆叠,因为它涉及所有子数组的完整副本,但在我们所给出的数组上确实使用了矢量化函数:
from functools import reduce
import numpy as np
# make example
N = 1000,
a,b,c,d,e = (np.random.random(N) for _ in "abcde")
# my proposal
def f_pp():
return reduce(np.maximum,(a,b,c,d,e))
# @yatu's
def f_yatu():
return np.max((a,b,c,d,e),0)
# @rusu_ro1 1st
def f_rr_1():
return [max(x) for x in zip(a, b, c, d, e)]
# 2nd
def f_rr_2():
return list(map(max, zip(a, b, c, d, e)))
# rusu_ro1 modified by pp 1st
def f_rr_pp_1():
return [*map(max,a,b,c,d,e)]
# 2nd
def f_rr_pp_2():
return np.fromiter(map(max,a,b,c,d,e),float,1000)
# timings and check
all_funcs = {k:v for (k,v) in globals().items() if k.startswith('f_')}
for k,v in all_funcs.items():
print(k,timeit(v,number=1000),'correct',np.all(f_pp()==v()))样本运行:
# f_pp 0.012913539074361324 correct True
# f_yatu 0.025256304070353508 correct True
# f_rr_1 0.8206795542500913 correct True
# f_rr_2 0.7683364972472191 correct True
# f_rr_pp_1 0.7669085101224482 correct True
# f_rr_pp_2 0.7993066972121596 correct True发布于 2019-09-05 10:49:04
您可以使用:
1)对数组中具有公共索引的元素应用max buil函数,在列表理解中使用zip:
[max(e) for e in zip(a, b, c)]2)类似于:
list(map(max, zip(a, b, c)))产出:
[4, 62, 34, 6]( 3)或@yatu建议:
np.max([a,b,c], axis=0)产出:
array([ 4, 62, 34, 6])https://stackoverflow.com/questions/57803677
复制相似问题