numpy数组的每个元素如何根据其相对值进行操作?

时间:2010-12-09 17:14:13

标签: python numpy

假设我们有一个数组

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函数执行此操作的最简洁方法是什么?

4 个答案:

答案 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])

例如,funcAa的元素设置为39到41,从而避免了奇怪的行为,从而将其置于funcB的范围内。

答案 3 :(得分:0)

如果您需要更复杂的功能,可以使用

      newfunc=numpy.vectorize(lambda x: func(x))
      result=newfunc(yourArray)

其中func(x)是你的功能。