我知道如何沿轴向量化()或应用函数..但我的情况有点不同。 我有一个包含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进行进一步的计算。
我该怎么做? (以某种方式进行原地修改?) 我很乐意,如果还有一个函数需要一个函数数组并将它应用到另一个数组:)这样我可能不需要进行现场修改?
谢谢..答案 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))