假设有一个名为" A"的二维numpy数组(或数学矩阵),我想将第一行与另一行交换" n"。 n可以是任何自然数。以下代码不起作用
A = np.eye(3)
n = 2
A[0], A[n] = A[n], A[0]
print(A)
你可以看到它给出了(为简单起见,我显示了矩阵形式)
A =
0, 0, 1
0, 1, 0
0, 0, 1
但我想要的是
A =
0, 0, 1
0, 1, 0
1, 0, 0
我想过一个解决方案是引入另一个矩阵" B"等于" A",但" A"和" B"是不同的对象。然后这样做
A = np.eye(3)
B = np.eye(3)
A[0], A[n] = B[n], B[0]
这可以在A上进行正确的交换。但它需要一个额外的矩阵" B",我不知道它是否具有计算效率。或许你有更好的想法?谢谢:))
答案 0 :(得分:4)
列表交换通过引用传递交换变量。因此,通过传统交换按值#ifdef
您可以在此处进行内部列表修改。它一个接一个地执行,消除了覆盖问题。
<强>代码:强>
a,b=b,a
<强>输出:强>
import numpy as np
A = np.eye(3)
n = 2
A[[0,n]] = A[[n,0]]
print(A)
答案 1 :(得分:1)
试试这个:
import numpy as np
A = np.eye(3)
A[[0, 2]] = A[[2, 0]]
print(A)
答案 2 :(得分:1)
numpy数组的子数组或切片创建数据视图而不是副本。有时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]