gpt4 book ai didi

python - numpy 数组中的快速值交换

转载 作者:行者123 更新时间:2023-11-28 19:35:41 25 4
gpt4 key购买 nike

所以,这应该很容易,但对我来说似乎花费了大量时间:我有一个只有两个值(示例 0 和 255)的 numpy 数组,我想反转矩阵这样,所有值都交换了(0 变为 255,反之亦然)。矩阵大约有 2000³ 个条目,所以这是一项严肃的工作!我首先尝试了 numpy.invert 方法,这并不是我所期望的。所以我尝试通过“存储”值然后覆盖它们来自己做:

for i in range(array.length):
array[i][array[i]==255]=1
array[i][array[i]==0]=255
array[i][array[i]==1]=0

它的行为符合预期,但需要很长时间(我猜是因为 for 循环?)。如果我将其实现为多线程计算,每个线程都“反转”一个较小的子数组,那会更快吗?或者还有其他更方便的方法吗?

最佳答案

除了@JanneKarila 和@EOL 的出色建议外,还值得展示一种使用掩码进行交换的更有效方法。

如果您的比较比简单地交换两个值更复杂,则使用 bool 掩码通常更有用,但您的示例以次优方式使用它。

目前,您在上面的示例中正在制作 bool “掩码”数组(例如 array[i] == blah)的多个临时副本并执行多个分配。您可以通过只制作一次“掩码” bool 数组并将其反转来避免这种情况。

如果您有足够的 ram 用于临时副本(bool dtype),请尝试如下操作:

mask = (data == 255)
data[mask] = 0
data[~mask] = 255

或者(等效地)您可以使用 numpy.where:

data = numpy.where(data == 255, 0, 255)

如果您使用循环来避免制作完整的临时副本,并且需要节省内存,请将您的循环调整为更像这样:

for i in range(len(array)):
mask = (array[i] == 255)
array[mask] = 0
array[~mask] = 255

综上所述,在这种情况下,减法或异或都是可行的方法,尤其是当您就地执行运算时!

关于python - numpy 数组中的快速值交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15901293/

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