python 如何将Numpy数组有效地转换为set?

mnemlml8  于 2023-04-19  发布在  Python
关注(0)|答案(3)|浏览(422)

我使用了:

df['ids'] = df['ids'].values.astype(set)

lists转换为sets,但输出是列表而不是集合:

>>> x = np.array([[1, 2, 2.5],[12,35,12]])

>>> x.astype(set)
array([[1.0, 2.0, 2.5],
       [12.0, 35.0, 12.0]], dtype=object)

Numpy中有没有一种有效的方法将list转换为set?

编辑1:

我的输入如下:
我有3,000条记录。每条有30,000个ID:[[1,..,12,13,..,30000],[1,..,43,45,..,30000],...,[...]]

9q78igpj

9q78igpj1#

首先将ndarray展平以获得一维数组,然后对其应用set():

set(x.flatten())

编辑:既然你似乎只是想要一个集合的数组,而不是整个数组的集合,那么你可以执行value = [set(v) for v in x]来获得集合的列表。

5kgi1eie

5kgi1eie2#

您的问题的当前状态(可以随时更改):如何有效地从一个大数组中删除重复元素?

import numpy as np

rng = np.random.default_rng()
arr = rng.random((3000, 30000))
out1 = list(map(np.unique, arr))
#or
out2 = [np.unique(subarr) for subarr in arr]

IPython shell中的运行时:

>>> %timeit list(map(np.unique, arr))
5.39 s ± 37.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

>>> %timeit [np.unique(subarr) for subarr in arr]
5.42 s ± 58.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

更新:正如@hpaulj在他的评论中指出的,我的虚拟示例是有偏见的,因为浮点随机数几乎肯定是唯一的。所以这里有一个更逼真的整数示例:

>>> arr = rng.integers(low=1, high=15000, size=(3000, 30000))

>>> %timeit list(map(np.unique, arr))
4.98 s ± 83.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

>>> %timeit [np.unique(subarr) for subarr in arr]
4.95 s ± 51.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

在这种情况下,输出列表的元素具有不同的长度,因为存在要删除的实际重复项。

wko9yo5t

wko9yo5t3#

几个早期的“行明智”的独特问题:
vectorize numpy unique for subarrays
Numpy: Row Wise Unique elements
Count unique elements row wise in an ndarray
在其中的几个例子中,计数比实际的唯一值更有趣。
如果每行的唯一值的数量不同,那么结果就不可能是一个(2d)数组。这很好地表明问题不能完全向量化。你需要对行进行某种迭代。

相关问题