问题描述
我知道如何vectorize()或沿轴应用函数。但是我的情况有些不同。 我有一个包含1或0的1D数组(z),然后有一个2D数组(x)。 我想根据array-z中该行的值为array-x中的每一行应用两个不同的函数。
if 0 apply fun0()
if 1 apply fun1()
我还可以建立一个索引,然后按索引进行应用,如下所示:
ndx1 = (z == 1)
ndx0 = (z == 0)
并做fe:
fun(x[:,ndx])
但这不会更改array-x。 我将需要此修改后的array-x进行进一步的计算。
我该怎么做? (以某种方式进行原位修改吗?)如果有一个函数接受一个函数数组并将其应用于另一个数组,我会很高兴:)这样,我可能就不需要进行原位修改了?
谢谢..
1楼
您要采取哪种行动?
In [19]: x=np.arange(12,dtype=float).reshape(4,3)
In [20]: z=np.array([0,1,0,1])
In [21]: I=(z==1)
In [22]: x[I,:]=x[I,:]*.1
In [23]: x
Out[23]:
array([[ 0. , 1. , 2. ],
[ 0.3, 0.4, 0.5],
[ 6. , 7. , 8. ],
[ 0.9, 1. , 1.1]])
行(或列)索引(此处为boolean I
)可用于方程式的两侧,既可以选择要使用的行,也可以覆盖要覆盖的行。
2楼
切片numpy数组可为您提供另一个查看相同数据的视图。 因此,如果您在此处更改其值,则可以更改原始值:
>>> a = np.array([1,2,0,0,1,4])
>>> a
array([1, 2, 0, 0, 1, 4])
>>> a[a == 0] = 5
>>> a
array([1, 2, 5, 5, 1, 4])
所以你想要的是
x[x == 0] = fun0(x[x == 0])
x[x == 1] = fun1(x[x == 1])
依次执行这些操作的可能问题是fun0
可能为某些值返回1
。
因此, fun0
被应用并产生1
,然后fun1
被应用。
如果对函数进行矢量化并不是十分重要,则可以考虑执行以下操作:
>>> def myfun(x_val):
... return fun0(x_val) if x_val == 0 else fun1(x_val)
...
>>> x = np.array(map(myfun,x))