定义:如果数组A(a1,a2,...,an)
大小相等且>=
对于每个从到B(b1,b2,...bn)
a_i>=b_i
i
1
n.
例如:
[1,2,3] >= [1,2,0]
[1,2,0] not comparable with [1,0,2]
[1,0,2] >= [1,0,0]
我有一个列表,其中包含大量此类数组(大约 10000,但可以更大)。数组的元素是正整数。我需要从这个列表中删除所有比至少一个其他数组大的数组。换句话说:如果存在这样B
的,A >= B
则删除A
。
这是我目前的O(n^2)
方法,非常慢。我只是将每个数组与所有其他数组进行比较,如果它更大,则将其删除。有什么方法可以加快速度。
import numpy as np
import time
import random
def filter_minimal(lst):
n = len(lst)
to_delete = set()
for i in xrange(n-1):
if i in to_delete:
continue
for j in xrange(i+1,n):
if j in to_delete: continue
if all(lst[i]>=lst[j]):
to_delete.add(i)
break
elif all(lst[i]<=lst[j]):
to_delete.add(j)
return [lst[i] for i in xrange(len(lst)) if i not in to_delete]
def test(number_of_arrays,size):
x = map(np.array,[[random.randrange(0,10) for _ in xrange(size)] for i in xrange(number_of_arrays)])
return filter_minimal(x)
a = time.time()
result = test(400,10)
print time.time()-a
print len(result)
PS 我注意到使用numpy.all
而不是内置 pythonall
会大大减慢程序的速度。可能是什么原因?