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

时间:2016-08-26 15:00:20

标签: 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)
B = np.eye(3)
A[0], A[n] = B[n], B[0]

这可以在A上进行正确的交换。但它需要一个额外的矩阵" B",我不知道它是否具有计算效率。或许你有更好的想法?谢谢:))

3 个答案:

答案 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] 
相关问题