gpt4 book ai didi

python - 在 Numpy 中获取向量集并集的有效方法

转载 作者:行者123 更新时间:2023-12-04 13:43:08 26 4
gpt4 key购买 nike

我正在尝试实现特定的二进制搜索算法。 “Results”一开始应该是一个空集,在搜索过程中,Results变量会与我们得到的新结果成为一个联合。

基本上:

results = set()
for result in search():
results = results.union(result)

但是这样的代码实际上不适用于 Numpy 数组,所以我们使用 np.union1d以此目的:
results = np.array([])
for result in search():
result = np.union1d(results, result)

上面的代码也不起作用,因为如果我们有两个向量 a = [1,2,3]b=[3,4,5] , np.union1d(a, b)将返回:
[1, 2, 3, 4, 5]
但我希望它返回:
[[1, 2, 3], [3,4,5]]
由于没有重复的向量,如果我们有例如 union([[1, 2, 3], [3,4,5]], [1,2,3]) ,返回值应保持:
[[1, 2, 3], [3,4,5]]
所以我会说我需要一个 基于 numpy 数组的联合 .

我也考虑使用 np.append(a, b)然后 np.unique(x) ,但是这两个函数都将低维数组投影到高维数组。 np.append还有 axis=0属性,它保留插入的所有数组的维度,但我无法有效地实现它而不会出现维度错误。

题:

如何有效地实现基于向量的集合?这样联合中的点将被视为向量而不是标量,并且将保留它们的向量形式和维度。

最佳答案

下面是一些基本的集合操作。

定义一对列表(它们可以是 np.array([1,2,3]) ,但这不是您显示的内容。

In [261]: a = [1,2,3]; b=[3,4,5]

其中几个的列表:
In [263]: alist = [a, b, a]
In [264]: alist
Out[264]: [[1, 2, 3], [3, 4, 5], [1, 2, 3]]

我可以通过转换为元组并将它们放入 set 来获得唯一值。 .
In [265]: set([tuple(i) for i in alist])
Out[265]: {(1, 2, 3), (3, 4, 5)}

我还可以将该列表转换为二维数组:
In [266]: arr = np.array(alist)
In [267]: arr
Out[267]:
array([[1, 2, 3],
[3, 4, 5],
[1, 2, 3]])

并使用 unique 获取唯一行和轴参数:
In [269]: np.unique(arr, axis=0)
Out[269]:
array([[1, 2, 3],
[3, 4, 5]])

比较时间
In [270]: timeit np.unique(arr, axis=0)
46.5 µs ± 142 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [271]: timeit set([tuple(i) for i in alist])
1.01 µs ± 1.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

将数组转换为列表或将列表转换为数组会增加一些时间,但基本模式仍然存在。
In [272]: timeit set([tuple(i) for i in arr.tolist()])
1.53 µs ± 13.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [273]: timeit np.unique(alist, axis=0)
53.3 µs ± 90.3 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

对于更大的、真实的源,相对时间可能会发生一些变化,但我希望元组集将保持最佳状态。集合操作不是 numpy优点。 unique进行排序,然后消除重复项。 set使用散列方法,类似于 Python 用于字典的方法。

如果您必须从 source 迭代收集值,我建议建立一个列表,然后做 set/unique一次。
alist = []
for x in source():
alist.append(x)

或以下之一:
alist = [x for x in source()]
alist = list(source())
alist = [tuple(x) for x in source()]
alist = [tuple(x.tolist()) for x in source()]

关于python - 在 Numpy 中获取向量集并集的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53949850/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com