如果满足条件,如何交换Nx2 numpy数组的行元素?

问题描述 投票:0回答:4

如果条件my_arrayswap[i],我想将第i行的元素交换为Nx2 numpy数组True

我的尝试:

def swap_positions_conditionally(my_array, swap):
    for i in range(np.shape(my_array)[0]):
        if swap[i]:
            my_array[i] = my_array[i][::-1]
    return my_array

运作正常,例如给定

my_array = array([[0, 1],
                  [2, 3],
                  [4, 5],
                  [6, 7],
                  [8, 9]])

swap = array([0, 0, 1, 1, 0])

产生预期的结果

[[0 1]
 [2 3]
 [5 4]
 [7 6]
 [8 9]]

但是,可能有一个更惯用的表达方式来重写我的swap_position_conditionally。有什么更好(更有效)的书写方式?

python numpy swap idiomatic
4个回答
1
投票

这是直接使用Numpy的布尔索引的一个:

import numpy as np

my_array = np.asarray([[0, 1],
                  [2, 3],
                  [4, 5],
                  [6, 7],
                  [8, 9]])

swap = np.array([0, 0, 1, 1, 0], dtype=bool)

my_array[swap, :] = my_array[swap,:][:,(1,0)]

突破关键点:

  • [my_array[swap, :] =的意思是“分配给swap为真的行”]
  • [my_array[swap,:]的意思是“选择swap为真的整行”]
  • [[:,(1,0)]的意思是“对于左边的每一行,交换列0和1”]

0
投票

这里是一个使用np.take_along_axis的人:

np.take_along_axis(my_array, np.c_[swap, 1-swap], axis=1)

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


0
投票

这里是一种方式-

In [54]: np.where(swap[:,None]!=1,my_array,my_array[:,::-1])
Out[54]: 
array([[0, 1],
       [2, 3],
       [5, 4],
       [7, 6],
       [8, 9]])
© www.soinside.com 2019 - 2024. All rights reserved.