3 回答

TA貢獻1803條經驗 獲得超6個贊
這是一個直接使用 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 列”
關于問題的“更有效”部分......
所有測試的通用設置(種子確保序列相同):
import timeit
setup= '''
import numpy as np
np.random.seed(42)
my_array = np.random.random([10000,2])
swap = np.random.random([10000]) > 0.5
'''
所有測試運行 1000 次迭代
原碼:5.621秒
timeit.timeit('swap_positions_conditionally(my_array, swap)', setup=setup, number=1000)
添加了 to 的定義,swap_positions_conditionally如setup問題所示。
這個答案:0.2657 秒
timeit.timeit('my_array[swap, :] = my_array[swap,:][:,(1,0)]', setup=setup, number=1000)
Divakar 的回答:0.176 秒
timeit.timeit('np.where(swap[:,None]!=1,my_array,my_array[:,::-1])', setup=setup, number=1000)
亞圖第一個答案:0.214秒
timeit.timeit('np.take_along_axis(my_array, np.c_[swap, 1-swap], axis=1)', setup=setup, number=1000)
亞圖的第二個答案:0.2547秒
timeit.timeit('my_array[swap,:] = my_array[swap,::-1]', setup=setup, number=1000)
結論
分析顯示 Divakar 的版本是最快的。無論哪種更直觀或更易讀,都取決于口味,您可以選擇您喜歡的一種(盡管我個人是索引符號可讀性的粉絲......)

TA貢獻1796條經驗 獲得超4個贊
這是一種交換Nx2數組并在您嘗試時使用負步長切片翻轉更多列的方法 -
In [56]: np.where(swap[:,None]==1, my_array[:,::-1], my_array)
Out[56]:
array([[0, 1],
[2, 3],
[5, 4],
[7, 6],
[8, 9]])
語法是:np.where(conditional_statement, choose_for_True, choose_for_False)。所以,在我們的例子中,我們想要在swapis時翻轉/交換1,否則不要。需要該[:,None]部分在每一行中按元素執行此操作。如果swap已經是一個布爾數組,則跳過比較部分。

TA貢獻1872條經驗 獲得超4個贊
這是一個使用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]])
或基于布爾索引:
swap = swap.astype(bool)
my_array[swap,:] = my_array[swap,::-1]
添加回答
舉報