【问题标题】:Python - create mask of unique values in arrayPython - 在数组中创建唯一值的掩码
【发布时间】:2013-10-23 13:33:57
【问题描述】:

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

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

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):

第一种方法:751ms

第二种方法:618ms

第三种方法:3.63ms

这两种方法都归功于 mtitan8。

【问题讨论】:

    标签: python performance optimization numpy mask


    【解决方案1】:

    我相信最快的方法是使用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
    

    【讨论】:

    • 确实有一些加速。从 708 毫秒到 559 毫秒。谢谢你。我仍在寻找更快的速度。
    • 我认为这已经足够了。谢谢你。我已经在我原来的问题中以性能实现了这两种方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2016-02-16
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    相关资源
    最近更新 更多