我想在numpy 2D数组中获得唯一性,但是该数组是这样的:
a = np.array([[1,2,3], [2,3], [1]])
np.unique(a)
因此,数组具有不同数量的元素,我想要具有唯一元素的扁平数组,如下所示:
[1,2,3]
但是“ np.unique”无法正常工作。
答案 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