如何在numpy数组中获取具有每个数组中不同数量元素的唯一元素?

时间:2018-07-10 18:54:07

标签: python arrays numpy

我想在numpy 2D数组中获得唯一性,但是该数组是这样的:

a = np.array([[1,2,3], [2,3], [1]])
np.unique(a)

因此,数组具有不同数量的元素,我想要具有唯一元素的扁平数组,如下所示:

[1,2,3]

但是“ np.unique”无法正常工作。

2 个答案:

答案 0 :(得分:4)

由于内部列表的长度不同,您有一个 object 类型的数组,np.unique会将对象(内部列表)而不是元素进行比较;您需要使用np.concatenate在一维数组中手动​​展平数组,然后使用np.unique

np.unique(np.concatenate(a))
# array([1, 2, 3])

答案 1 :(得分:1)

另一种方法是使用itertools.chain展平列表,然后使用np.unique()。如果列表很大,这可能比np.concatenate()快。

例如,考虑以下内容:

首先生成随机数据:

from itertools import chain
import numpy as np
import pandas as pd

N = 100000
a = np.array(
    [[np.random.randint(0,1000) for _ in range(np.random.randint(0,10))] for _ in range(N)]
)

计时结果:

%%timeit
np.unique(list(chain.from_iterable(a)))
#10 loops, best of 3: 66.7 ms per loop

%%timeit
np.unique(np.concatenate(a))
#10 loops, best of 3: 123 ms per loop

您还可以使用pandas.unique,根据文档:

  

比numpy.unique快得多。包括NA值。

%%timeit
pd.unique(np.concatenate(a))
#10 loops, best of 3: 107 ms per loop

%%timeit
pd.unique(list(chain.from_iterable(a)))
#10 loops, best of 3: 57.2 ms per loop
相关问题