亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果滿足條件,如何交換 Nx2 numpy 數組的行的元素?

如果滿足條件,如何交換 Nx2 numpy 數組的行的元素?

小怪獸愛吃肉 2022-07-05 19:09:59
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.什么是更好(和更有效)的編寫方式?
查看完整描述

3 回答

?
慕碼人8056858

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 的版本是最快的。無論哪種更直觀或更易讀,都取決于口味,您可以選擇您喜歡的一種(盡管我個人是索引符號可讀性的粉絲......)


查看完整回答
反對 回復 2022-07-05
?
SMILET

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已經是一個布爾數組,則跳過比較部分。


查看完整回答
反對 回復 2022-07-05
?
守著一只汪

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]


查看完整回答
反對 回復 2022-07-05
  • 3 回答
  • 0 關注
  • 174 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號