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

4

我希望在numpy的2D数组中获取唯一值,但是数组如下:

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

所以,这个数组有不同数量的元素,我想要将其压缩成只包含唯一元素的数组,就像这样:

[1,2,3]

但是,“np.unique”没有按预期工作。

这不是一个二维数组。它是一个列表的一维数组(查看 shapedtype)。 - hpaulj
2个回答

5

由于内部列表长度不同,您有一个对象类型的数组,np.unique将对象(内部列表)相互比较而不是元素;您需要使用np.concatenate手动展开数组为1d数组,然后使用np.unique

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接