【问题标题】:Create a set of numpy arrays创建一组 numpy 数组
【发布时间】:2018-08-11 16:20:35
【问题描述】:

我想创建一组 numpy 数组,然后高效地执行in 操作。

explored = {
       np.array([[4,9,6,1,2,5], [5,8,3,7,7,9], [2,4,1,6,3,8]]),
       np.array([[1,2,3,1,2,5], [1,2,3,7,7,9], [1,2,3,6,3,8]]),
           }

if array in explored: # where array is an np.array 
    print("the array is already in the set")
else:
    explored.append(array)

但解释器抱怨np.array 不是可散列类型。我能做些什么呢?

【问题讨论】:

  • if array in explored: 中的array 是什么?
  • 要放入set,对象必须是不可变的。集合就像字典的键。因此可以使用tuple,但不能使用listarray 就像一个列表,其中元素可以更改,因此它没有唯一的“哈希”。
  • 明确你想要什么样的in 测试。您显示两个 (2,6) 数组。什么会使另一个数组相同?一样的形状? dtype,精确(整数)值?还是相同的数组对象ID? np.in1d 是几个数组 set 函数之一。 np.unique 是另一个。

标签: python python-3.x numpy set


【解决方案1】:

首先得到一个正则的np.array:

explored = np.array([[4,9,6,1,2,5], [5,8,3,7,7,9], [2,4,1,6,3,8]])

那么explored就是

np.array([[4,9,6,1,2,5], [5,8,3,7,7,9], [2,4,1,6,3,8]])

然后将其转换为集合。但要做到这一点,请将 np.array 中的每一行转换为一个元组,这样它就是可散列的。

explored_set = {tuple(row) for row in explored}

现在explored_set

{(2, 4, 1, 6, 3, 8), (4, 9, 6, 1, 2, 5), (5, 8, 3, 7, 7, 9)}

现在您可以将其用于搜索:

if tuple(array) in explored_set:
    # processing here

等等。请注意,集合的顺序与 np.array 的顺序不同,这是典型的。

【讨论】:

  • 并将explored.append(array) 更改为explored.add(tuple(array)),因为它现在是一个集合。
  • @Alexander:我不明白 OP 正在尝试什么处理,所以我把它留给了他。但你是对的,如果这是 OP 正在尝试的,在将名称 explored 更改为 explored_set 之后。
  • @RoryDaulton 每个二维数组都是集合的一个元素,而不是我提供的原始集合中的 3 个元素。然而,在我感兴趣的情况下,“转向元组,散列”的一般原则同样适用
猜你喜欢
  • 2017-12-30
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 2023-01-04
  • 2021-08-15
  • 1970-01-01
相关资源
最近更新 更多