Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python 3中,如何在二维numpy数组中交换两个子数组?_Python_Arrays_Numpy_Matrix - Fatal编程技术网

在Python 3中,如何在二维numpy数组中交换两个子数组?

在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的二维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,我不知道它是否有计算效率。或者你有更好的主意?谢谢:

试试这个:

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]]