numpy数组中的快速值交换

Dsc*_*oni 2 python arrays numpy

所以,这应该是相当容易的,但它似乎需要花费大量的时间给我:我有一个只有两个值的numpy数组(例如0和255)我想以这种方式反转矩阵,所有值交换(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
Run Code Online (Sandbox Code Playgroud)

这是表现出预期的,但需要很长时间(我猜是因为for循环?).如果我将其实现为多线程计算,其中每个线程"反转"一个较小的子数组,那会更快吗?还是有另一种方法可以更方便地做到这一点?

Joe*_*ton 6

除了@ JanneKarila和@ EOL的优秀建议之外,值得展示一种更有效的方法来使用掩码进行交换.

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

目前,您正在array[i] == blah上面的示例中制作布尔"掩码"数组(例如)的多个临时副本,并执行多个赋值.你可以通过只做一次"掩码"布尔数组并反转它来避免这种情况.

如果你有足够的ram用于临时副本(booldtype),请尝试这样的事情:

mask = (data == 255)
data[mask] = 0
data[~mask] = 255
Run Code Online (Sandbox Code Playgroud)

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

data = numpy.where(data == 255, 0, 255)
Run Code Online (Sandbox Code Playgroud)

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

for i in range(len(array)):
     mask = (array[i] == 255)
     array[mask] = 0
     array[~mask] = 255
Run Code Online (Sandbox Code Playgroud)

所有这一切,无论是减法还是XOR都是这种情况下的方法,特别是如果你就地进行操作!