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]])
正在尝试应用 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]])