Python 对numpy数组具有多个相等条件
假设我有一个大的2D numpy数组,称之为a,它包含从0到9的整数 我正在尝试编写一个函数,它返回一个二进制numpy数组,并将其称为与a形状相同的B,它具有以下特性 如果A中的对应元素出现在给定列表L中,则B中的条目为1;否则,条目为零 下面显示了可能不是最有效的代码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 有没有更快的办法 谢谢
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