【问题标题】:比较二维布尔数组
【发布时间】:2022-01-23 08:19:32
【问题描述】:

我正在解决一个问题,我需要将 1 个特定数组与数十万其他数组进行比较,并返回一个结果列表,显示它们彼此之间的相似程度,我读到 numpy 可能是最好的库关于使用数组(如果有更好的请告诉我:) 所以我写了这个,但它仍然很慢。我不是最擅长编程的,因此我们将不胜感激任何有助于改进这一点的帮助!

import numpy as np

list_of_arrays = [np.random.randint(0, 2, (30, 30)) for array in range(100000)]
base_array = np.random.randint(0, 2, (30, 30))
results = []

for array in list_of_arrays:
    results.append(np.sum(np.equal(base_array, array)))

【问题讨论】:

  • 比较部分非常快,需要几秒钟,因为生成所有这些随机数需要时间
  • @Giedrius 请在下面查看我的答案。我已经验证它会产生与您的代码相同的结果,并且它可能会更快一些,因为它使用纯 numpy(无循环)。如果它对你来说不够快,你应该放弃,因为它不能变得更快;)

标签: python arrays numpy


【解决方案1】:

您可以使用 numpy 广播魔术在一个列表中执行此操作,而无需列表理解或任何类型的循环:

results = np.equal(base_array, list_of_arrays).sum(axis=1).sum(axis=1)

你有这么多数组,它不能变得更快;)

【讨论】:

  • 感谢您的提示。我想我需要更多的 RGB
  • 是的,机器功率是目前你能做到的最好的。是不是更快了?
  • 从 1.7 到 1.46。还是更快,谢谢伙计!
  • 好吧,聊胜于无! :)
  • 尝试使用按位异或
【解决方案2】:

在 numpy 中有许多有效的技巧可以做到这一点。它们都不需要显式循环或附加到列表。

首先,将列表变成一个数组:

list_of_arrays = np.random.randint(0, 2, (100000, 30, 30), dtype=bool)

请注意这是多么简单(和更快)。现在制作一个布尔基数:

base_array = np.random.randint(0, 2, (30, 30), dtype=bool)

最简单的比较是直接使用广播:

results = (base_array == list_of_arrays).sum((1, 2))

两个布尔值的相等性也可以通过它们的异或得到:

results = (~base_array ^ list_of_arrays).sum((1, 2))

base_array 上运行~ 比在list_of_arrays 或异或结果上运行要快得多,并且具有相同的逻辑效果。

您可以通过分解最后的维度来简化总和:

results = (base_array.ravel() == list_of_arrays.reshape(100000, -1)).sum(-1)

【讨论】:

  • 哇,好多了,非常感谢!
  • @GiedriusGurevičius。你最终选择了哪一个?
猜你喜欢
  • 2015-04-17
  • 2015-02-10
  • 2016-05-05
  • 2016-03-11
  • 1970-01-01
  • 2021-11-24
  • 2013-05-19
相关资源
最近更新 更多