Python 对numpy数组具有多个相等条件

Python 对numpy数组具有多个相等条件,python,arrays,numpy,matrix,conditional-statements,Python,Arrays,Numpy,Matrix,Conditional Statements,假设我有一个大的2D numpy数组,称之为a,它包含从0到9的整数 我正在尝试编写一个函数,它返回一个二进制numpy数组,并将其称为与a形状相同的B,它具有以下特性 如果A中的对应元素出现在给定列表L中,则B中的条目为1;否则,条目为零 下面显示了可能不是最有效的代码 A = np.random.randint(0, 10, (5, 5)) L = [3,4,5] B = np.zeros(A.shape) for e in L: B[A==e] = 1 有没有更快的办法 谢谢

假设我有一个大的2D numpy数组,称之为a,它包含从0到9的整数

我正在尝试编写一个函数,它返回一个二进制numpy数组,并将其称为与a形状相同的B,它具有以下特性

如果A中的对应元素出现在给定列表L中,则B中的条目为1;否则,条目为零

下面显示了可能不是最有效的代码

A = np.random.randint(0, 10, (5, 5))
L = [3,4,5]

B = np.zeros(A.shape)
for e in L:
    B[A==e] = 1
有没有更快的办法

谢谢

这里有两个带有np.in1d的numpy选项,它是来自基本python的in的矢量化版本。当阵列较大时,第一个选项显示一些加速:

方案一快速方案一:

方案二和方案一:

时间:

结果检查:

这里有两个带有np.in1d的numpy选项,它是来自基本python的in的矢量化版本。当阵列较大时,第一个选项显示一些加速:

方案一快速方案一:

方案二和方案一:

时间:

结果检查:


使用@Psidom的1000x1000矩阵,我介绍了另外两种方法,包括@Psidom提供的np.in1d方法

一个使用迭代求和,另一个使用迭代按位或

迭代的按位or(trial2)在下面得到了证明,它提供的结果大约比原始结果快4倍,比numpy的in3d快2倍,但是请注意,它提供了布尔类型的矩阵结果

当按位方法被修改为返回整数结果trial2_int时,其速度基本上相当于numpy的in1d

结果:

%timeit original()
# 100 loops, best of 3: 10.5 ms per loop
%timeit trial1()
# 100 loops, best of 3: 9.43 ms per loop
%timeit trial2()
# 100 loops, best of 3: 2.37 ms per loop
%timeit trial2_int()
# 100 loops, best of 3: 5.31 ms per loop
%timeit trial_Psidom()
# 100 loops, best of 3: 5.37 ms per loop    

使用@Psidom的1000x1000矩阵,我介绍了另外两种方法,包括@Psidom提供的np.in1d方法

一个使用迭代求和,另一个使用迭代按位或

迭代的按位or(trial2)在下面得到了证明,它提供的结果大约比原始结果快4倍,比numpy的in3d快2倍,但是请注意,它提供了布尔类型的矩阵结果

当按位方法被修改为返回整数结果trial2_int时,其速度基本上相当于numpy的in1d

结果:

%timeit original()
# 100 loops, best of 3: 10.5 ms per loop
%timeit trial1()
# 100 loops, best of 3: 9.43 ms per loop
%timeit trial2()
# 100 loops, best of 3: 2.37 ms per loop
%timeit trial2_int()
# 100 loops, best of 3: 5.31 ms per loop
%timeit trial_Psidom()
# 100 loops, best of 3: 5.37 ms per loop    

看来我得指出显而易见的一点:

def AinL(A, L):
    B = np.zeros((10,), int)
    B[L] = 1
    return B[A]
基准:

 10x10 #L=3
orig     0.6665631101932377
HAL      0.4370500799268484
Psidom   1.13961720908992
PP       0.23527960386127234

 100x100 #L=3
orig     0.3015591569710523
HAL      0.29902734607458115
Psidom   0.4470538650639355
PP       0.18963343487121165

 1000x1000 #L=4
orig     0.5516874771565199
HAL      0.5967503408901393
Psidom   0.6331975681241602
PP       0.23225238709710538

 10000x1000 #L=2
orig     0.8539429588709027
HAL      0.9840140701271594
Psidom   1.0392512339167297
PP       0.7203555379528552

看来我得指出显而易见的一点:

def AinL(A, L):
    B = np.zeros((10,), int)
    B[L] = 1
    return B[A]
基准:

 10x10 #L=3
orig     0.6665631101932377
HAL      0.4370500799268484
Psidom   1.13961720908992
PP       0.23527960386127234

 100x100 #L=3
orig     0.3015591569710523
HAL      0.29902734607458115
Psidom   0.4470538650639355
PP       0.18963343487121165

 1000x1000 #L=4
orig     0.5516874771565199
HAL      0.5967503408901393
Psidom   0.6331975681241602
PP       0.23225238709710538

 10000x1000 #L=2
orig     0.8539429588709027
HAL      0.9840140701271594
Psidom   1.0392512339167297
PP       0.7203555379528552

我的计时结果提供了另一种说法。我使用的是来自anaconda的Python3.5和Numpy1.10.4,原始循环的速度大约是使用in1d的3倍。编辑:我现在知道你使用了1000x1000个随机矩阵。我将使用相同大小的矩阵重新测试。@我刚才也在Python3上测试过,我得到了非常一致的结果。第一个np.INAD选项速度更快。您正在测试的阵列有多大?Psidom的结果在使用1000x1000时得到确认。我的计时结果提供了不同的说明。我使用的是来自anaconda的Python3.5和Numpy1.10.4,原始循环的速度大约是使用in1d的3倍。编辑:我现在知道你使用了1000x1000个随机矩阵。我将使用相同大小的矩阵重新测试。@我刚才也在Python3上测试过,我得到了非常一致的结果。第一个np.INAD选项速度更快。您正在测试的数组有多大?当使用1000x1000时,Psidom的结果得到了确认。如果L相对于A小,np.INAD会对trial2进行一次折叠-在L上迭代并使用B |=…如果L相对于A小,np.INAD会对trial2进行一次折叠-在L上迭代并使用B |=。。。。
def AinL(A, L):
    B = np.zeros((10,), int)
    B[L] = 1
    return B[A]
 10x10 #L=3
orig     0.6665631101932377
HAL      0.4370500799268484
Psidom   1.13961720908992
PP       0.23527960386127234

 100x100 #L=3
orig     0.3015591569710523
HAL      0.29902734607458115
Psidom   0.4470538650639355
PP       0.18963343487121165

 1000x1000 #L=4
orig     0.5516874771565199
HAL      0.5967503408901393
Psidom   0.6331975681241602
PP       0.23225238709710538

 10000x1000 #L=2
orig     0.8539429588709027
HAL      0.9840140701271594
Psidom   1.0392512339167297
PP       0.7203555379528552