在每个元素上使用Numpy.where()和函数

在每个元素上使用Numpy.where()和函数,numpy,Numpy,我有一个相当复杂的函数,比如: def func(elem): // blah blah blah return True // blah blah blah return False 我希望使用numpy.where()函数 arr2 = np.where(func(arr1), arr1, 0) 但是当我尝试这种语法并进行调试时,我发现在func中,传递的是整个数组,而不是单个元素。我在文档/示例中看到的典型用例仅依赖于简单的比较器,如arr5: 返回真值

我有一个相当复杂的函数,比如:

def func(elem):
    // blah blah blah
    return True
    // blah blah blah
    return False
我希望使用numpy.where()函数

arr2 = np.where(func(arr1), arr1, 0)
但是当我尝试这种语法并进行调试时,我发现在
func
中,传递的是整个数组,而不是单个元素。我在文档/示例中看到的典型用例仅依赖于简单的比较器,如
arr<5
,但我需要一些更高级的东西,我不想尝试在一行中编写


如果这是可能的,或者如果有一些矢量化的替代品(强调效率),任何见解都值得赞赏。

似乎您试图使用
func
函数获取所需的
arr1
元素,但从定义来看
func
适用于单个元素。为此,您需要一个与
arr1
形状相同的真/假数组


如果我做对了,一个可能的解决方案是修改
func
对整个数组进行操作,而不是只对一个元素进行操作,并返回
arr1.shape
的真/假数组,您需要
np.where
,因为您希望以这种方式在一行中进行操作。

似乎您试图使用
func
函数获取所需的
arr1
元素,但从定义来看
func
适用于单个元素。为此,您需要一个与
arr1
形状相同的真/假数组


如果我做对了,一个可能的解决方案是修改
func
对整个数组进行操作,而不是只对一个元素进行操作,并返回
arr1.shape
的真/假数组,您需要
np.where
,因为你想用一行的方式来做。

我通过使用
np.vectorize
,然后是
列表理解,而不是
np.where
,找到了如何做的方法。也许从这里,你可以找到一种使用numpy而不是列表理解的方法

func\u vec=np.vectorize(func)
[如果函数中的条件为0,则为arr1(arr1)]
无论如何,通过使用
func_-vec(arr1)
可以获得每个元素的真/假值


注意:如果您想要一个新数组,如
arr1
,用0替换函数中返回False的元素,那么这应该可以:

arr2 = np.where(func_vec(arr1), arr1, 0)

编辑:

事实上,
np.vectorize
并没有针对性能进行优化(通过bad),本质上是一个问题。因此,我建议尝试以矢量化的方式编写函数,而不是在以后尝试矢量化函数

例如,尝试如下转换函数:

定义函数(元素): 如果elem>5: 返回真值 其他: 返回错误
对这样的事情:

定义函数(元素): 返回元素>5 这样您就可以轻松地应用
func(arr1)
而不会出错


如果你真的有一个只返回
True
False
的函数,我很肯定你可以做到,不管它有多复杂。不管怎样,我们是来帮你的

我通过使用
np.vectorize
,然后是
列表理解
,而不是
np.where
,找到了解决方法。也许从这里,你可以找到一种使用numpy而不是列表理解的方法

func\u vec=np.vectorize(func)
[如果函数中的条件为0,则为arr1(arr1)]
无论如何,通过使用
func_-vec(arr1)
可以获得每个元素的真/假值


注意:如果您想要一个新数组,如
arr1
,用0替换函数中返回False的元素,那么这应该可以:

arr2 = np.where(func_vec(arr1), arr1, 0)

编辑:

事实上,
np.vectorize
并没有针对性能进行优化(通过bad),本质上是一个问题。因此,我建议尝试以矢量化的方式编写函数,而不是在以后尝试矢量化函数

例如,尝试如下转换函数:

定义函数(元素): 如果elem>5: 返回真值 其他: 返回错误 对这样的事情:

定义函数(元素): 返回元素>5 这样您就可以轻松地应用
func(arr1)
而不会出错


如果你真的有一个只返回
True
False
的函数,我很肯定你可以做到,不管它有多复杂。不管怎样,我们是来帮你的

传递整个数组,因为您将整个数组作为输入参数提供。一种解决方案是让函数遍历输入数组并返回另一个相同大小的数组。传递整个数组,因为您将整个数组作为输入参数提供。一种解决方案是让函数遍历输入数组并返回另一个大小相同的数组。虽然现在我尝试了这种方法,但它似乎和简单地遍历数组并应用func一样慢。我想知道是否还有其他方法/资源可以有效地将函数应用于数组的每个元素。嘿,哪个代码块适合您?第一个带
列表理解
或最后一个带
np。其中
?只是想知道你的目标…np.vectorize后面是一个列表理解。好吧,这一切都“起作用了”,这只是一个速度问题。我已经编辑了答案。我认为解决问题的最好方法是直接在你的职能范围内工作。让我知道它是否有效。如果没有,也许最好删除这个已被接受的答案,以便其他人可以提供更好的解决方案。尽管现在我尝试了这个方法,但它似乎与简单地遍历数组并应用func一样慢。我想知道是否还有其他方法/资源可以有效地将函数应用于数组的每个元素。嘿,哪个代码块适合您?第一个带
列表理解
或最后一个带
np。其中
?只是想知道你的目标…np.vec