在Python 3中,如何在二维numpy数组中交换两个子数组?
假设数学中有一个名为A的二维numpy数组或矩阵,我想用另一行n替换它的第一行。n可以是任何自然数。以下代码不起作用在Python 3中,如何在二维numpy数组中交换两个子数组?,python,arrays,numpy,matrix,Python,Arrays,Numpy,Matrix,假设数学中有一个名为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)
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,我不知道它是否有计算效率。或者你有更好的主意?谢谢:试试这个:
import numpy as np
A = np.eye(3)
A[[0, 2]] = A[[2, 0]]
print(A)
试试这个:
import numpy as np
A = np.eye(3)
A[[0, 2]] = A[[2, 0]]
print(A)
列表交换通过传递引用交换变量。因此,通过传统的按值交换(即a,b=b,a)来进行内部元素交换是行不通的 在这里,您可以进行内部列表修改。它一个接一个地执行,从而消除了覆盖问题 代码: 输出:
列表交换通过传递引用交换变量。因此,通过传统的按值交换(即a,b=b,a)来进行内部元素交换是行不通的 在这里,您可以进行内部列表修改。它一个接一个地执行,从而消除了覆盖问题 代码: 输出:
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]
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]
尝试一个[[0,n]]=A[[n,0]]尝试一个[[0,n]]=A[[n,0]]