我希望将一个函数应用于numpy数组的每一行。如果此函数的值为true,则将保留该行,否则将其丢弃。例如,我的功能可能是:
def f(row): if sum(row)>10: return True else: return False
我想知道是否有类似的东西:
np.apply_over_axes()
它将一个函数应用于numpy数组的每一行并返回结果。我希望有这样的东西:
np.filter_over_axes()
这会将一个函数应用于numpy数组的每一行,并且仅返回该函数返回true的行。像这样吗 还是应该只使用for循环?
理想情况下,您将能够实现函数的矢量化版本并将其用于布尔索引。对于绝大多数问题,这是正确的解决方案。Numpy提供了很多功能,它们可以作用于各个轴以及所有基本操作和比较,因此最有用的条件应该是可矢量化的。
import numpy as np x = np.random.randn(20, 3) x_new = x[np.sum(x, axis=1) > .5]
如果您绝对确定不能执行上述操作,那么我建议您使用列表推导(或np.apply_along_axis)创建一个布尔数组以作为索引。
np.apply_along_axis
def myfunc(row): return sum(row) > .5 bool_arr = np.array([myfunc(row) for row in x]) x_new = x[bool_arr]
这将以相对干净的方式完成工作,但比矢量化版本要慢得多。一个例子:
x = np.random.randn(5000, 200) %timeit x[np.sum(x, axis=1) > .5] # 100 loops, best of 3: 5.71 ms per loop %timeit x[np.array([myfunc(row) for row in x])] # 1 loops, best of 3: 217 ms per loop