Python - 在数组中创建唯一值的掩码

时间:2013-10-15 16:36:30

标签: python performance optimization numpy mask

我有两个numpy数组,xy(长度约为2M)。 x是有序的,但有些值是相同的。

x中的值相同时,任务是删除yx的值。我的想法是创造一个面具。以下是我到目前为止所做的事情:

def createMask(x):
  idx = np.empty(x.shape, dtype=bool)
  for i in xrange(len(x)-1):
    if x[i+1] == x[i]:
      idx[i] = False

  return idx

idx = createMask(x)
x   = x[idx]
y   = y[idx]

此方法工作正常,但速度很慢(%timeit为705毫秒)。另外我认为这看起来真的很结实。是否有更优雅和有效的方式(我确信有)。

更新了最佳答案

第二方法是

idx = [x[i+1] == x[i] for i in xrange(len(x)-1)]

第三(和最快)方法

idx = x[:-1] == x[1:]

结果是(使用ipython的%timeit):

第一个方法:751毫秒

第二方法:618毫秒

第三方法:3.63毫秒

两种方法都归功于mtitan8。

1 个答案:

答案 0 :(得分:3)

我认为最快的方法是使用numpy的x数组运算符比较==

idx = x[:-1] == x[1:]

在我的机器上,使用x在[0,100]中有一百万个随机整数,

In[15]: timeit idx = x[:-1] == x[1:]
1000 loops, best of 3: 1 ms per loop