【发布时间】:2016-02-16 20:03:16
【问题描述】:
我知道,为了将元素添加到集合中,它必须是可散列的,而 numpy 数组似乎不是。这给我带来了一些问题,因为我有以下代码:
fill_set = set()
for i in list_of_np_1D:
vecs = i + np_2D
for j in range(N):
tup = tuple(vecs[j,:])
fill_set.add(tup)
# list_of_np_1D is a list of 1D numpy arrays
# np_2D is a 2D numpy array
# np_2D could also be converted to a list of 1D arrays if it helped.
我需要让它运行得更快,将近 50% 的运行时间用于将 2D numpy 数组的切片转换为元组,以便将它们添加到集合中。
所以我一直在尝试找出以下内容
- 是否有任何方法可以使 numpy 数组或类似 numpy 数组(具有向量加法)功能的东西可散列化,以便将它们添加到集合中?
- 如果没有,有什么方法可以加快元组转换的过程吗?
感谢您的帮助!
【问题讨论】:
-
NumPy 数组不仅不可散列,它们甚至都不是真正的 equatable。如果
a或b中的任何一个是数组,并且set不知道如何处理元素比较结果数组或如何拨打np.array_equal。 -
您真的需要将数组转换为 Python 集吗? Numpy 原生支持对数组的各种集合操作(参见
numpy.lib.arraysetops)。 -
@ali_m 我不知道谢谢,我现在去看看。最终我有两个大的一维整数数组集合,我需要能够向这些集合添加更多数组并执行与集合具有的
.difference_update操作等效的操作。 -
您可以使用
tuple(vecs[j,:].tolist())来减少转换时间。如果您只想将数组保存在集合中,您甚至可以通过vecs[j, :].tobytes()将数组转换为字节对象。 -
@HYRY 谢谢,我现在就去试试。
标签: python numpy casting set tuples