假设我们有一个数组
a = np.array([10,30,50, 20, 10, 90, 0, 25])
我想要的伪代码 -
if a[x] > 80 then perform funcA on a[x]
if 40 < a[x] <= 80 then perform funcB on a[x]
if a[x] <= 40 then perform funcC on a[x]
使用numpy函数执行此操作的最简洁方法是什么?
答案 0 :(得分:14)
通常,您尝试避免在NumPy数组上进行任何Python循环 - 这就是您首先使用NumPy的原因。为了举例,我假设funcA()
为所有元素添加1,funcB()
添加2,funcC()
添加3(请详细说明他们为更加量身定制的示例做了什么) 。要实现您的目标,您可以这样做:
subset_a = a > 80
subset_b = (40 < a) & (a <= 80)
subset_c = a <= 40
a[subset_a] += 1
a[subset_b] += 2
a[subset_c] += 3
这使用NumPy advanced indexing。例如,a > 80
求值为布尔值数组,可用于选择满足条件的数组中的条目。
答案 1 :(得分:8)
看看numpy.piecewise。我想你想要:
np.piecewise( a, [a > 80, (40 < a) & (a <= 80), a <= 40], [funcA, funcB, funcC] )
答案 2 :(得分:3)
我喜欢这个:
b = np.empty(a.shape)
b[a < 40] = funcA(a[a < 40])
b[(a > 40) & (a <= 80)] = funcB(a[(a > 40) & (a <= 80)])
b[a > 80] = funcC(a[a > 80])
例如,funcA
将a
的元素设置为39到41,从而避免了奇怪的行为,从而将其置于funcB
的范围内。
答案 3 :(得分:0)
如果您需要更复杂的功能,可以使用
newfunc=numpy.vectorize(lambda x: func(x))
result=newfunc(yourArray)
其中func(x)是你的功能。