我希望在numpy的2D数组中获取唯一值,但是数组如下:
a = np.array([[1,2,3], [2,3], [1]])
np.unique(a)
所以,这个数组有不同数量的元素,我想要将其压缩成只包含唯一元素的数组,就像这样:
[1,2,3]
但是,“np.unique”没有按预期工作。
由于内部列表长度不同,您有一个对象类型的数组,np.unique
将对象(内部列表)相互比较而不是元素;您需要使用np.concatenate
手动展开数组为1d数组,然后使用np.unique
:
np.unique(np.concatenate(a))
# array([1, 2, 3])
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
shape
和dtype
)。 - hpaulj