当前位置: 代码迷 >> python >> 如何将多个函数应用于numpy数组?
  详细解决方案

如何将多个函数应用于numpy数组?

热度:30   发布时间:2023-06-20 19:23:50.0

我知道如何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进行进一步的计算。

我该怎么做? (以某种方式进行原位修改吗?)如果有一个函数接受一个函数数组并将其应用于另一个数组,我会很高兴:)这样,我可能就不需要进行原位修改了?

谢谢..

您要采取哪种行动?

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 )可用于方程式的两侧,既可以选择要使用的行,也可以覆盖要覆盖的行。

切片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))