假设我有一个3x3的numpy数组:
[[0, 1, 2],
[2, 0, 1],
[1, 2, 0]]
还有一个附加向量:
[2,
1,
1]
对于矩阵中的每一行,我想将第0个索引处的数字与向量中对应索引处的数字交换。在此示例中,交换之后,最终输出将是:
[[2, 1, 0], # the 0th and 2nd positions have been swapped
[0, 2, 1], # the 0th and 1st positions have been swapped
[2, 1, 0]] # the 0th and 1st positions have been swapped
您该怎么做?
答案 0 :(得分:1)
import numpy as np
A = np.asarray([[0, 1, 2],
[2, 0, 1],
[1, 2, 0]])
col_idxs = np.asarray([2, 1, 1])
row_idxs = np.arange(len(A))
a = A[:, 0].copy()
A[:, 0] = A[row_idxs, col_idxs]
A[row_idxs, col_idxs] = a
或更简洁
c = np.asarray([2, 1, 1])
r = np.arange(len(A))
A[:, 0], A[r, c] = A[r, c], A[:, 0].copy()
在这里,我们利用以下事实为索引:可以为numpy数组的各个元素提供索引,分别为相应的row和col索引提供两个类似列表的对象。
因此,A[:, 0], A[r, c] = A[r, c], A[:, 0].copy()
行可以理解为从各列获取索引元素并将其与第一列交换。
感谢@Paul Panzer的评论,通过将其写为A[r, c], A[:, 0] = A[:, 0], A[r, c]
可以使作业更短。
请注意,与早期版本相比,A[r, c]
和A[:, 0]
的分配顺序已更改。
此处可以省略副本的原因是
A[r, c]
)会返回与
切片(A[:, 0]
)返回视图。因此,这段新代码说的是
A
第一列的视图(即引用)A[r, c]
的副本。由于对Numpy数组进行了华丽的索引,因此该副本是隐式的。A[r, c]
第一列的值分配A
该列的视图。A
的第一列分配我们之前制作的A[r, c]
的副本
(请注意,此时A[r, c]
已经被分配了旧的
值A[:, 0]
。)此外,我们不需要将索引转换为Numpy数组。
c = [2, 1, 1]
r = range(len(A))
A[r, c], A[:, 0] = A[:, 0], A[r, c]
答案 1 :(得分:0)
Person.delete()