2

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

x任务是在两者的值相同时删除两者y的值x。我的想法是创建一个面具。这是我到目前为止所做的:

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]

这种方法效果很好,但速度很慢(705ms 和%timeit)。我也觉得这看起来真的很笨拙。有没有更优雅高效的方式(我确定有)。

更新为最佳答案

第二种方法

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

第三种(也是最快的)方法是

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

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

一种方法:751ms

第二种方法:618ms

第三种方法:3.63ms

这两种方法都归功于 mtitan8。

4

1 回答 1

3

我相信最快的方法是x使用 numpy 的==数组运算符进行比较:

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
于 2013-10-15T16:38:52.150 回答