Numpy 根据行索引沿轴应用

Numpy apply along axis based on row index

正在尝试应用 numpy 基于 row index position

的内置函数 apply_along_axis
import numpy as np
sa = np.array(np.arange(4))
sa_changed = (np.repeat(sa.reshape(1,len(sa)),repeats=2,axis=0))
print (sa_changed)

原帖:

[[0 1 2 3]
 [0 1 2 3]]

函数:

np.apply_along_axis(lambda x: x+10,0,sa_changed)

操作:

array([[10, 11, 12, 13],
       [10, 11, 12, 13]])

但是有没有办法基于 row index position 使用此函数,例如,如果它是 even row index 那么 add 10 如果它是 odd row index 那么 add 50

样本:

def func(x):
   if x.index//2==0:
      x = x+10
   else:
      x = x+50
   return x

直接或使用 apply_along_axis 对数组进行迭代时,子数组没有 .index 属性。所以我们必须将一个明确的索引值传递给你的函数:

In [248]: def func(i,x):
     ...:    if i//2==0:
     ...:       x = x+10
     ...:    else:
     ...:       x = x+50
     ...:    return x
     ...: 
In [249]: arr = np.arange(10).reshape(5,2)

apply 无法添加此索引,因此我们必须使用显式迭代。

In [250]: np.array([func(i,v) for i,v in enumerate(arr)])
Out[250]: 
array([[10, 11],
       [12, 13],
       [54, 55],
       [56, 57],
       [58, 59]])

用 %

替换 //
In [251]: def func(i,x):
     ...:    if i%2==0:
     ...:       x = x+10
     ...:    else:
     ...:       x = x+50
     ...:    return x
     ...: 
In [252]: np.array([func(i,v) for i,v in enumerate(arr)])
Out[252]: 
array([[10, 11],
       [52, 53],
       [14, 15],
       [56, 57],
       [18, 19]])

但更好的方法是完全跳过迭代:

创建行添加的数组:

In [253]: np.where(np.arange(5)%2,10,50)
Out[253]: array([50, 10, 50, 10, 50])

通过broadcasting应用它:

In [256]: x+np.where(np.arange(5)%2,50,10)[:,None]
Out[256]: 
array([[10, 11],
       [52, 53],
       [14, 15],
       [56, 57],
       [18, 19]])

这是一种方法

import numpy as np

x = np.array([[0, 1, 2, 3],
     [0, 1, 2, 3]])

y = x.copy() # if you dont wish to modify x

对于偶数行索引

y[::2] = y[::2] + 10 

对于奇数行索引

y[1::2] = y[1::2] + 50

输出:

array([[10, 11, 12, 13],
       [50, 51, 52, 53]])