【发布时间】:2018-12-28 04:35:41
【问题描述】:
我正在尝试实现特定的二进制搜索算法。 “Results”一开始应该是一个空集,在搜索过程中,Results变量会和我们得到的新结果成为一个union。
基本上:
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 属性,它保留所有插入的数组的维度,但我无法有效地实现它而不会出现维度错误。
问题:
如何有效地实现基于向量的集合?这样联合中的点将被视为向量而不是标量,并将保留它们的向量形式和维度。
【问题讨论】:
-
如何将数组转换为元组?
tuple(arr.tolist())。 Pythonset需要可散列的对象,例如tuples。 -
@hpaulj
tolist()方法不是让算法效率更低吗?我试过将这样的元组附加到数组中,它们大大增加了时间。由于出现“不可散列类型”错误,我无法尝试使用集合。 -
@Kasrâmvd 我确实尝试过
np.unique提到的(轴参数也是如此),但我不确定如何有效地为高维数组实现它。 (即如何定义初始向量而不出现尺寸错误) -
set如果你可以给它像元组这样的可散列对象,那么它是非常有效的。numpy集合函数一般使用np.unique,它是基于对元素进行排序。unique最初使用一维数组,np.union1d仍然如此。它已被扩展为采用axis参数,但其核心仍然是一维排序。