如果条件my_array
为swap[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
。有什么更好(更有效)的书写方式?
这是直接使用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”]这里是一个使用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]])
这里是一种方式-
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]])