假设我有一个数组:
np.where(a < 0)
使用{{1}},它返回一个索引列表,其中元素a是&lt; 0
如何为某些元素应用函数?
答案 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]])