将函数应用于numpy.where的结果

时间:2017-02-27 17:42:41

标签: python numpy

假设我有一个数组:

np.where(a < 0)

使用{{1}},它返回一个索引列表,其中元素a是&lt; 0

如何为某些元素应用函数?

4 个答案:

答案 0 :(得分:2)

如果将列表转换为numpy数组,则会更容易:您可以使用布尔数组索引数组:

In [2]: a = np.asarray([1,2,3,4,0,-1,-2,3,4])

In [3]: a[a < 0]
Out[3]: array([-1, -2])

In [4]: np.sin(a[a < 0])
Out[4]: array([-0.84147098, -0.90929743])

In [5]: a[a < 0]**2
Out[5]: array([1, 4])

这里的关键是a < 0本身就是一个数组:

In [6]: a < 0
Out[6]: array([False, False, False, False, False,  True,  True, False, False], dtype=bool)

答案 1 :(得分:1)

一般情况下,我建议使用布尔掩码跟随@ ev-br方法。但如果您使用所有三个参数,那么np.where也可以。第二个参数指定条件为True的索引处选择的值,以及False的第三个参数:

>>> import numpy as np
>>> a = np.array([1,2,3,4,0,-1,-2,3,4])
>>> np.where(a < 0, 1000, a)   # replace values below 0 with 1000
array([   1,    2,    3,    4,    0, 1000, 1000,    3,    4])

如果您想应用numpy-ufunc(例如np.sin),只需替换1000

>>> np.where(a < 0, np.sin(a), a)
array([ 1.,  2.,  3.,  4.,  0., -0.84147098, -0.90929743,  3.,  4.])

Alternativly(这要求数组已经有正确的dtype来存储函数的结果)你可以使用np.where返回的索引来应用结果:

>>> a = np.array([1,2,3,4,0,-1,-2,3,4], dtype=float) # must be floating point now
>>> idx = np.where(a < 0)
>>> a[idx] = np.sin(a[idx])
>>> a
array([ 1.,  2.,  3.,  4.,  0., -0.84147098, -0.90929743,  3.,  4.])

答案 2 :(得分:-1)

我不会与numpy合作很多,但你的意思是这些吗?

my_arr = np.array(a)

def my_func(my_array):
    for elem in np.where(my_array < 0):
       my_array[elem] =  my_array[elem] + 1 * 3
       return my_array

np.apply_along_axis(my_func, 0, my_arr)
rray([1, 2, 3, 4, 0, 2, 1, 3, 4])

答案 3 :(得分:-2)

这样的事情应该有效:

square = lambda x: x**2
applied_func_array = [square(x) for x in a if x < 0]

numpy.vectorize

vec_square = np.vectorize(square)
vec_square(less_than_zero)

哪个收益率:

Out[220]: 
array([[1],
       [4]])