2016-08-26 47 views
1

假設有一個名爲「A」的二維numpy數組(或數學中的矩陣),我想將第一行換成另一行「n」。 n可以是任何自然數。下面的代碼將不會工作在Python 3中,如何交換2維numpy數組中的兩個子數組?

A = np.eye(3) 
n = 2 
A[0], A[n] = A[n], A[0] 
print(A) 

你可以看到它給了(我展示了簡單的矩陣形式A)

A = 
    0, 0, 1 
    0, 1, 0 
    0, 0, 1 

但我要的是

A = 
    0, 0, 1 
    0, 1, 0 
    1, 0, 0 

我想過一種解決方案是引入另一個等於「A」的矩陣「B」,但是「A」和「B」是不同的對象。然後做這個

A = np.eye(3) 
B = np.eye(3) 
A[0], A[n] = B[n], B[0] 

這可以給A.正確交換但它需要額外的矩陣「B」,我不知道這是否是有效的計算。或者,也許你有更好的主意?謝謝:)

+0

嘗試'A [[0,n]] = A [[n,0]]' – hpaulj

回答

3

名單交換通過通過引用傳遞交換的變量。因此,通過傳統值交換來執行內部元素交換不起作用,這是a,b=b,a

在這裏,您可以執行內部列表修改。這一個接一個地執行,消除了重寫問題。

代碼:

import numpy as np 
A = np.eye(3) 
n = 2 
A[[0,n]] = A[[n,0]] 
print(A) 

輸出:numpy的陣列

[[ 0. 0. 1.] 
[ 0. 1. 0.] 
[ 1. 0. 0.]] 
+0

它解決了我的問題。謝謝 :) – aura

1

試試這個:

import numpy as np 

A = np.eye(3) 
A[[0, 2]] = A[[2, 0]] 
print(A) 
1

子陣列或切片創建視圖的數據,而不是拷貝。有時numpy可以檢測到這種情況並防止數據損壞。但是,numpy在使用python成語進行交換時無法檢測到。在交換之前,您至少需要複製其中一個視圖。

tmp = A[0].copy() 
A[0] = A[n] 
A[n] = tmp 

考慮到您正在改變數組中的大部分數據,可能會更容易完全創建新數組。

indices = np.arange(n+1) 
indices[0], indices[n] = indices[n], indices[0] # this is okay as indices is a 1-d array 
A = A[indices] 
相關問題