2016-06-13 50 views
1

我不確定正確的術語來搜索以找到正確的優化。我想將下面最後四行代碼簡化爲兩行,其中+/- 1的添加分別在賦值爲plusminus變量時完成。在分配期間修改numpy索引

# generic params to simulate loop conditions 
    position = np.arange(10) 
    axis = 2 

    # actual code to optimise 
    plus = np.asarray(position) 
    plus[axis] += 1 
    minus = np.asarray(position) 
    minus[axis] -= 1 

爲了澄清這是一個迭代的問題:不採用通用positionaxis變量是錯的,即明確以下的任何解決方案都沒有解決方案:

plus = np.asarray([0,1,3,3,4,5,6,7,8,9]) 
plus = np.asarray(range(axis)+[position[axis]+1]+range(axis+1,len(position))) 

回答

1

下面是一個使用np.in1d到的方法冷凝那些四行兩個 -

mask = np.in1d(np.arange(position.size),axis) 
plus, minus = position + mask, position - mask 

採樣運行

讓我們來測試它的通用position陣列與其他指數6 -

In [60]: position 
Out[60]: array([1, 0, 6, 8, 1, 7, 1, 3, 1, 6]) 

In [61]: axis = 6 

In [62]: mask = np.in1d(np.arange(position.size),axis) 

In [63]: plus, minus = position + mask, position - mask 

In [64]: plus 
Out[64]: array([1, 0, 6, 8, 1, 7, 2, 3, 1, 6]) # Change at 6th index 

In [65]: minus 
Out[65]: array([1, 0, 6, 8, 1, 7, 0, 3, 1, 6]) # Change at 6th index 
+0

出於本能,我還以爲你騙用'np.arange(position.size)'!這實際上是一個非常好的解決方案,並且**完全**我之後的事情。 *雖然只是將它們組合在一個元組中,但在我的書中肯定會作弊,因爲我們不妨使用分號! (:* - 我也喜歡布爾邏輯使用框外的好想法 –

+0

@AlexanderMcFarlane那麼,如果你是那麼嚴格,你可以做'position + np.in1d(np.arange(position.size),axis)'和'position - np.in1d(np.arange(position.size),axis)'。但是這有點冗餘代碼。所以,你知道:) – Divakar

+0

touché:要嚴格執行*兩行*的要求,你有一個選擇低效的代碼或偷偷摸摸的捷徑。我懷疑這可能是錯誤的代碼寫入兩行,但我希望解決方案就地管理,所以謝謝! –