2013-09-29 61 views
1
from numpy import * 

import collections 

array = [28000,35200,35200,35200,35700,36000] 

rng = range(35000,37000) 

for elem in array: 

    print elem 

這讓我開了個好頭,但我只需要在範圍列表,這隻會是35200的重複。我嘗試添加打印ELEM下一條線,用於例 -Python 2.7版嘗試使用範圍縮小列表和重複

print elem 

print [x for x, y in collections.Counter(a).items if y > 1] 

,但我得到TypeError: 'numpy.float64' object is not iterable。以後需要重複一個等式。我怎樣才能縮小數組範圍內的副本?

+0

不要調用列表'array',因爲它會以相同的名稱對模塊進行遮擋... –

+0

更不用說它會陰影'numpy'導入的'array'功能 – SethMMorton

+0

您想要做什麼?什麼是'a'?通過「我只需要範圍列表中的重複項」,你的意思只是'array'中出現多次的元素,或者只是出現在'rng'中的元素?什麼是'rng'甚至? – user2357112

回答

1

items是一個函數,你忘了()

counterItems = collections.Counter(a).items() 
print [x for x, y in counterItems if y > 1] 
0

另一種方式來做到這一點:

In [15]: a = [28000,35200,35200,35200,35700,36000] 

In [16]: set([x for x in a if a.count(x) > 1]) 
Out[16]: set([35200]) 
+0

這是'O(n²)',而原來是'O(n)'。 – Veedrac

0

做的numpy方式將是:

>>> a=np.array([28000,35200,35200,35200,35700,36000]) 
>>> a[np.sum(a==a[...,np.newaxis], axis=1)>1] 
array([35200, 35200, 35200]) 
>>> np.unique(a[np.sum(a==a[...,np.newaxis], axis=1)>1]) 
array([35200]) 
0

假設a正在排序,這可能是最快的方法(與numpy),包括該範圍的限制:

import numpy 

a = numpy.array([28000,35000,35200,35200,35200,35200,35700,36000]) 

left = a.searchsorted(35000, "left") 
right = a.searchsorted(37000, "right") 
section = a[left:right] 
numpy.unique(section[section[1:] == section[:-1]]) 
#>>> array([35200]) 

類似的加速比可通過使用bisect模塊上常規的非numpy的陣列中找到。