让我们考虑以下几点 矩阵 </跨度> :
[v1 v2 v3 v4 v5 v6] =1.,0.,0.,0.,0.,0], [0.,0.,1.,0.,0.,0。], [0.,1.,0.,0.,0.,0。], [0.,0.,0.,1.,0.,0。], [0,0,0,0,0,0,1], [0,0。,0.,0.,1.,0。,
其中向量[v2 v3]和[v5 v6]相对于身份进行切换 矩阵 </跨度> 。
从身份开始 矩阵 </跨度> ,我们怎样才能建立前一个 矩阵 </跨度> 使用切片鈥
没有一个函数(我知道)将交换列的位置,因为您可以在发布时使用基本切片来执行此操作。您始终可以构建该类型的函数:
def swap(arr, *tups, copy=False): ix = np.array(tups) if copy: arr = arr.copy() arr[ix.ravel()] = arr[ix[:,::-1].ravel()] return arr swap(np.eye(6), (0,2), (1,3)) >> array([[0., 0., 1., 0., 0., 0.], [0., 0., 0., 1., 0., 0.], [1., 0., 0., 0., 0., 0.], [0., 1., 0., 0., 0., 0.], [0., 0., 0., 0., 1., 0.], [0., 0., 0., 0., 0., 1.]])
如果你想要性能,我会建议使用稀疏矩阵。该 csr_matrix 存储非零列 indices ,使切换列容易:
csr_matrix
indices
import scipy.sparse as sparse I = sparse.eye(6, format='csr') I.indices[[0,2,1,3]] = I.indices[[2,0,3,1]] print(I.todense()) >> array([[0., 0., 1., 0., 0., 0.], [0., 0., 0., 1., 0., 0.], [1., 0., 0., 0., 0., 0.], [0., 1., 0., 0., 0., 0.], [0., 0., 0., 0., 1., 0.], [0., 0., 0., 0., 0., 1.]])
矢量解决方案可扩展到任何 N :
N
N=2 s = np.zeros((3*N,3*N)) pattern = [[1,0,0],[0,0,1],[0,1,0]] s.reshape(N,3,N,3)[range(N),:,range(N),:] = pattern
对于
array([[1., 0., 0., 0., 0., 0.], [0., 0., 1., 0., 0., 0.], [0., 1., 0., 0., 0., 0.], [0., 0., 0., 1., 0., 0.], [0., 0., 0., 0., 0., 1.], [0., 0., 0., 0., 1., 0.]])
像这样的东西?
# helper function, swaps two rows def swaprows(arr, row1, row2): temp = arr[row1].copy() arr[row1] = arr[row2] arr[row2] = temp return arr a = np.eye(6) a = swaprows(a, 1, 2) a = swaprows(a, 4, 5) print(a) # => # [[1. 0. 0. 0. 0. 0.] # [0. 0. 1. 0. 0. 0.] # [0. 1. 0. 0. 0. 0.] # [0. 0. 0. 1. 0. 0.] # [0. 0. 0. 0. 0. 1.] # [0. 0. 0. 0. 1. 0.]]
请注意,python使用0索引,我猜你来自R或Matlab,你的最后一个代码块将a)不使用双括号和b)你会因为尝试索引大小数组而得到索引超出范围的错误6位于第6位。