如何将 Numpy 数组转为高效设置?
How to turn Numpy array to set efficiently?
我用过:
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
中有没有一种有效的方法可以将列表转换为集合?
编辑 1:
我的输入如下:
我有 3,000 条记录。每个都有 30,000 个 id:[[1,...,12,13,...,30000], [1,..,43,45,...,30000],...,[...] ]
首先将您的 ndarray 展平以获得一维数组,然后在其上应用 set():
set(x.flatten())
编辑:既然你似乎只想要一个集合数组,而不是整个数组的集合,那么你可以value = [set(v) for v in x]
获得集合列表。
您问题的当前状态(随时可能更改):如何有效地从大量大型数组中删除唯一元素?
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]
IPythonshell中的运行时:
>>> %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)
Update:正如 在他的评论中指出的那样,我的虚拟示例是有偏见的,因为浮点随机数几乎肯定是唯一的。所以这是一个更逼真的整数示例:
>>> 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)
在这种情况下,输出列表的元素具有不同的长度,因为要删除实际的重复项。
几个较早的 'row-wise' 独特问题:
Numpy: Row Wise Unique elements
在其中的几个中,计数比实际的唯一值更有趣。
如果每行的唯一值数量不同,则结果不能是 (2d) 数组。这是一个很好的迹象,表明问题无法完全矢量化。您需要对行进行某种迭代。
我用过:
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
中有没有一种有效的方法可以将列表转换为集合?
编辑 1:
我的输入如下:
我有 3,000 条记录。每个都有 30,000 个 id:[[1,...,12,13,...,30000], [1,..,43,45,...,30000],...,[...] ]
首先将您的 ndarray 展平以获得一维数组,然后在其上应用 set():
set(x.flatten())
编辑:既然你似乎只想要一个集合数组,而不是整个数组的集合,那么你可以value = [set(v) for v in x]
获得集合列表。
您问题的当前状态(随时可能更改):如何有效地从大量大型数组中删除唯一元素?
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]
IPythonshell中的运行时:
>>> %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)
Update:正如
>>> 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)
在这种情况下,输出列表的元素具有不同的长度,因为要删除实际的重复项。
几个较早的 'row-wise' 独特问题:
Numpy: Row Wise Unique elements
在其中的几个中,计数比实际的唯一值更有趣。
如果每行的唯一值数量不同,则结果不能是 (2d) 数组。这是一个很好的迹象,表明问题无法完全矢量化。您需要对行进行某种迭代。