将条件函数应用于numpy数组的每个元素

时间:2020-05-01 15:45:38

标签: python numpy

我有这个功能:

if elem < 0:
    elem = 0
else:
    elem = 1

我想将此功能应用于NumPy数组中的每个元素,当仅对相同尺寸执行此功能时,可以使用for loop完成此操作。但是在这种情况下,无论数组的尺寸和形状如何,我都需要它起作用。可以使用NumPy在Python中实现这一目标吗?

还是有任何通用方法将任何def应用于NumPy n维数组中的每个元素?

6 个答案:

答案 0 :(得分:6)

不是

arr = (arr >= 0).astype(int)

答案 1 :(得分:2)

np.where

np.where(arr < 0, 0, 1)

答案 2 :(得分:2)

您可以使用布尔掩码定义一组决策。让我们来看一个具体的例子。您有一个正负数数组,并且只想在正数位置取平方根:

arr = np.random.normal(size=100)

您计算出一个类似的蒙版

mask = arr >= 0

应用蒙版最直接的方法是创建一个输出数组,并填写所需的元素:

result = np.empty(arr.shape)
result[mask] = np.sqrt(arr[mask])
result[~mask] = arr[~mask]

这不是超级有效,因为您必须计算掩码的逆并将其多次应用。对于此特定示例,您可以利用np.sqrtufunc的事实,并使用其where keyword

result = arr.copy()
np.sqrt(arr, where=mask, out=result)

应用蒙版的一种流行方法是使用np.where,但我专门构造了此示例来说明警告。简单的方法是计算

result = np.where(mask, np.sqrt(arr), arr)

where根据np.sqrt(arr)是否真实,从arrmask中选择一个值。在许多情况下,这是一个非常好的方法,但是您必须预先计算两个分支的值,而这正是使用平方根避免的情况。

TL; DR

您的特定示例正在寻找蒙版本身的表示形式。如果您不关心类型:

result = arr >= 0

如果您关心类型:

result = (arr >= 0).astype(int)

OR

result = -np.clip(arr, -1, 0)

这些解决方案创建与输入不同的数组。如果要替换同一缓冲区中的值,

mask = arr >= 0
arr[mask] = 1
arr[~mask] = 0

答案 3 :(得分:1)

您可以执行以下操作:

import numpy as np

a=np.array([-2,-1,0,1,2])

a[a>=0]=1
a[a<0]=0

>>> a
array([0, 0, 1, 1, 1])

答案 4 :(得分:0)

上述解决方案的替代方法可以是将列表理解与三元运算符结合在一起。

my_array = np.array([-1.2, 3.0, -10.11, 5.2])
sol = np.asarray([0 if val < 0 else 1 for val in my_array])

看看这些来源 https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions https://book.pythontips.com/en/latest/ternary_operators.html

答案 5 :(得分:-2)

使用numpy.vectorize():

import numpy as np

def unit(elem):
    if elem < 0:
        elem = 0
    else:
        elem = 1
a = np.array([[1, 2, -0.5], [0.5, 2, 3]])
vfunc = np.vectorize(unit)
vfunc(a)

# array([[1, 1, 0], [1, 1, 1]])