如何对numpy数组应用多个函数?

2 投票
2 回答
2324 浏览
提问于 2025-04-17 21:41

我知道怎么使用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))

撰写回答