1
from numpy import *

import collections

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

rng = range(35000,37000)

for elem in array:

    print elem

35200 35700 36000

这让我有了一个良好的开端,但我只需要范围列表中的重复项,即 35200。我尝试在 print elem 下添加一行,例如 -

print elem

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

但我明白了TypeError: 'numpy.float64' object is not iterable。稍后将需要副本用于方程式。如何将数组缩小到某个范围内的重复项?

4

4 回答 4

1

items是一个函数,你忘记了()

counterItems = collections.Counter(a).items()
print [x for x, y in counterItems if y > 1]
于 2013-09-29T20:49:15.030 回答
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 数组上使用该模块可以找到类似的加速。

于 2013-09-29T22:06:35.203 回答
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])
于 2013-09-29T20:53:51.210 回答
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])
于 2013-09-29T21:02:06.863 回答