首页 > 解决方案 > 根据其内容交换 numpy 二维数组中的数组

问题描述

我有一个 numpy 数组

a = ([[1,2,3],
      [2,2,2],
      [1,5,3],
      [3,3,1]])


swap1 = [2,2,2]

swap2 = [3,3,1]

我想在不知道这 2 行的索引的情况下交换等于 swap1 和 swap2 的行。我希望输出看起来像这样

Out = ([[1,2,3],
        [3,3,1],
        [1,5,3],
        [2,2,2]])

最好的方法是什么?如果可以的话,我想避免循环。谢谢!

标签: pythonarraysnumpyswap

解决方案


>>> a = np.array([[1,2,3],
      [2,2,2],
      [1,5,3],
      [3,3,1]])
>>> x = [2,2,2]
>>> y = [3,3,1]

制作您感兴趣的行的布尔数组

>>> xmask = np.all(a==x,axis=1)
>>> ymask = np.all(a==y,axis=1)
>>> xmask
array([False,  True, False, False])
>>> ymask
array([False, False, False,  True])

然后使用它们来更改值

>>> a[xmask] = y
>>> a[ymask] = x
>>> a
array([[1, 2, 3],
       [3, 3, 1],
       [1, 5, 3],
       [2, 2, 2]])
>>>

如果数组是正方形

>>> a = np.array([[1,2,3,4],
      [2,2,2,9],
      [1,5,3,1],
      [3,3,1,8]])
>>> y = [3,3,1,8]
>>> x = [2,2,2,9]
>>> xmask = np.all(a==x,axis=1)
>>> ymask = np.all(a==y,axis=1)
>>> a[xmask,:] = y
>>> a[ymask,:] = x

布尔索引


推荐阅读