python是否存在数组_python-测试一个Numpy数组是否包含给定的

您可以使用.tolist()

>>> a = np.array([[1,2],[10,20],[100,200]])

>>> [1,2] in a.tolist()

True

>>> [1,20] in a.tolist()

False

>>> [1,20] in a.tolist()

False

>>> [1,42] in a.tolist()

False

>>> [42,1] in a.tolist()

False

或使用视图:

>>> any((a[:]==[1,2]).all(1))

True

>>> any((a[:]==[1,20]).all(1))

False

或者在numpy列表上生成(可能非常慢):

any(([1,2] == x).all() for x in a) # stops on first occurrence

或使用numpy逻辑函数:

any(np.equal(a,[1,2]).all(1))

如果您计时这些:

import numpy as np

import time

n=300000

a=np.arange(n*3).reshape(n,3)

b=a.tolist()

t1,t2,t3=a[n//100][0],a[n//2][0],a[-10][0]

tests=[ ('early hit',[t1, t1+1, t1+2]),

('middle hit',[t2,t2+1,t2+2]),

('late hit', [t3,t3+1,t3+2]),

('miss',[0,2,0])]

fmt='\t{:20}{:.5f} seconds and is {}'

for test, tgt in tests:

print('\n{}: {} in {:,} elements:'.format(test,tgt,n))

name='view'

t1=time.time()

result=(a[...]==tgt).all(1).any()

t2=time.time()

print(fmt.format(name,t2-t1,result))

name='python list'

t1=time.time()

result = True if tgt in b else False

t2=time.time()

print(fmt.format(name,t2-t1,result))

name='gen over numpy'

t1=time.time()

result=any((tgt == x).all() for x in a)

t2=time.time()

print(fmt.format(name,t2-t1,result))

name='logic equal'

t1=time.time()

np.equal(a,tgt).all(1).any()

t2=time.time()

print(fmt.format(name,t2-t1,result))

您可以看到命中或未命中,numpy例程以相同的速度搜索数组。 对于早期命中而言,Python np.equal运算符的速度可能要快得多,如果您必须一直遍历数组,则生成器只是个坏消息。

以下是300,000 x 3元素数组的结果:

early hit: [9000, 9001, 9002] in 300,000 elements:

view 0.01002 seconds and is True

python list 0.00305 seconds and is True

gen over numpy 0.06470 seconds and is True

logic equal 0.00909 seconds and is True

middle hit: [450000, 450001, 450002] in 300,000 elements:

view 0.00915 seconds and is True

python list 0.15458 seconds and is True

gen over numpy 3.24386 seconds and is True

logic equal 0.00937 seconds and is True

late hit: [899970, 899971, 899972] in 300,000 elements:

view 0.00936 seconds and is True

python list 0.30604 seconds and is True

gen over numpy 6.47660 seconds and is True

logic equal 0.00965 seconds and is True

miss: [0, 2, 0] in 300,000 elements:

view 0.00936 seconds and is False

python list 0.01287 seconds and is False

gen over numpy 6.49190 seconds and is False

logic equal 0.00965 seconds and is False

对于3,000,000 x 3数组:

early hit: [90000, 90001, 90002] in 3,000,000 elements:

view 0.10128 seconds and is True

python list 0.02982 seconds and is True

gen over numpy 0.66057 seconds and is True

logic equal 0.09128 seconds and is True

middle hit: [4500000, 4500001, 4500002] in 3,000,000 elements:

view 0.09331 seconds and is True

python list 1.48180 seconds and is True

gen over numpy 32.69874 seconds and is True

logic equal 0.09438 seconds and is True

late hit: [8999970, 8999971, 8999972] in 3,000,000 elements:

view 0.09868 seconds and is True

python list 3.01236 seconds and is True

gen over numpy 65.15087 seconds and is True

logic equal 0.09591 seconds and is True

miss: [0, 2, 0] in 3,000,000 elements:

view 0.09588 seconds and is False

python list 0.12904 seconds and is False

gen over numpy 64.46789 seconds and is False

logic equal 0.09671 seconds and is False

这似乎表明np.equal是执行此操作的最快的纯numpy方法...

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值