如何对numpy数组应用多个函数?
我知道怎么使用vectorize()或者在某个轴上应用函数,但我的情况有点不同。
我有一个一维数组(z),里面只有1和0,然后还有一个二维数组(x)。
我想根据数组z中每一行的值,对数组x的每一行应用两种不同的函数。
if 0 apply fun0()
if 1 apply fun1()
我也可以建立一个索引,然后通过索引来应用,比如这样:
ndx1 = (z == 1)
ndx0 = (z == 0)
然后可以做比如:
fun(x[:,ndx])
但是这样不会改变数组x。
我需要这个修改后的数组x来进行进一步的计算。
我该怎么做呢?(有没有办法直接在原数组上修改?)
如果有一个函数可以接受一个函数数组,并将其应用到另一个数组上就好了 :) 这样我可能就不需要直接修改原数组了?
谢谢你..
2 个回答
2
你想要的这种操作是吗?
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]])
在这里,行(或列)索引(用一个布尔值 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))