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

时间:2014-03-10 19:53:04

标签: python arrays numpy

我知道如何沿轴向量化()或应用函数..但我的情况有点不同。 我有一个包含1或0的1D数组(z)然后我有一个2D数组(x)。 我想为array-x中的每一行应用两个不同的函数,具体取决于array-z中此行的值。

if 0 apply fun0()
if 1 apply fun1()

我也可以构建索引,然后按索引应用,如下所示:

ndx1 = (z == 1)
ndx0 = (z == 0)

并做f.e。:

fun(x[:,ndx])

但这不会改变array-x。 我需要这个修改过的array-x进行进一步的计算。

我该怎么做? (以某种方式进行原地修改?) 我很乐意,如果还有一个函数需要一个函数数组并将它应用到另一个数组:)这样我可能不需要进行现场修改?

谢谢..

2 个答案:

答案 0 :(得分: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)可以在等式的两边使用,既可以选择要使用的行,也可以选择要写入的行。

答案 1 :(得分: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))