Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy:数组的重复掩码(如果我们以前看到该值,则返回True,否则返回False)_Python_List_Numpy - Fatal编程技术网

Python Numpy:数组的重复掩码(如果我们以前看到该值,则返回True,否则返回False)

Python Numpy:数组的重复掩码(如果我们以前看到该值,则返回True,否则返回False),python,list,numpy,Python,List,Numpy,我正在寻找一个向量化函数,如果数组中的值以前被看到过,则返回一个值为True的掩码,否则返回False 我正在寻找最快的解决方案,因为速度非常重要 例如,这就是我希望看到的: array = [1, 2, 1, 2, 3] mask = [False, False, True, True, False] 所以is\u duplicate=array[mask]应该返回[1,2] 有没有一种快速、矢量化的方法可以做到这一点?谢谢 几乎按照定义,这是无法矢量化的。任何索引的掩码值取决于0和索引之间

我正在寻找一个向量化函数,如果数组中的值以前被看到过,则返回一个值为True的掩码,否则返回False

我正在寻找最快的解决方案,因为速度非常重要

例如,这就是我希望看到的:

array = [1, 2, 1, 2, 3]
mask = [False, False, True, True, False]
所以
is\u duplicate=array[mask]
应该返回
[1,2]


有没有一种快速、矢量化的方法可以做到这一点?谢谢

几乎按照定义,这是无法矢量化的。任何
索引
的掩码值取决于0和
索引
之间每个值的
数组
值。可能有一些算法,您可以将
数组
扩展到一个NxN矩阵中,并进行一些奇特的测试,但仍然会有一个O(n^2)算法。简单的集合算法是O(n log n)。

您可以使用
枚举
方法实现这一点,该方法允许您使用
索引+值进行循环:

array = [1, 2, 1, 2, 3]

mask = []

for i,v in enumerate(array):
  if array.index(v) == i:
    mask.append(False)
  else:
    mask.append(True)


print(mask)  
输出:

[False, False, True, True, False]
方法#1:带排序

def mask_firstocc(a):
    sidx = a.argsort(kind='stable')
    b = a[sidx]
    out = np.r_[False,b[:-1] == b[1:]][sidx.argsort()]
    return out
我们可以使用
数组分配
来提高性能。进一步-

def mask_firstocc_v2(a):
    sidx = a.argsort(kind='stable')
    b = a[sidx]
    mask = np.r_[False,b[:-1] == b[1:]]
    out = np.empty(len(a), dtype=bool)
    out[sidx] = mask
    return out
样本运行-

In [166]: a
Out[166]: array([2, 1, 1, 0, 0, 4, 0, 3])

In [167]: mask_firstocc(a)
Out[167]: array([False, False,  True, False,  True, False,  True, False])
方法#2:带有
np.unique(…,返回索引)

我们可以利用
np.unique
及其
return\u index
,它似乎返回每个唯一元素的第一次出现,因此一个简单的数组赋值,然后索引工作-

def mask_firstocc_with_unique(a):
    mask = np.ones(len(a), dtype=bool)
    mask[np.unique(a, return_index=True)[1]] = False
    return mask

使用
np.unique

a = np.array([1, 2, 1, 2, 3])
_, ix = np.unique(a, return_index=True)
b = np.full(a.shape, True)
b[ix] = False

In [45]: b
Out[45]: array([False, False,  True,  True, False])

最终目标是获得
[1,2]
还是您对
[False,False,True,True,False]
特别感兴趣?目标实际上是重复数据消除!但我有一个阵列,需要在阵列的各个部分中进行重复数据消除。例如,我的数组可以是
array=[1,2,1,2,1,2]
,其中我可能需要对
array[0:4]
array[4:6]
进行重复数据消除,以获得
[1,2,1,2]
。这就是为什么我想做一个面具,但很高兴能找到其他方法。谢谢你的回答!实际上我对我的问题做了一些编辑,我首先要寻找一个numpy解决方案,因为这个软件包不需要熊猫,只需要numpy和scipy。numpy中有类似的东西吗?谢谢这太棒了,我使用了你的mask_firstocc_v2,谢谢:)运行时编号在unique和argsort之间是相似的。也要考虑独特排序。虽然独特排序看起来慢了一点,但它对我的用例更有效。谢谢:)