使用切片/索引在矩阵内切换numpy向量


易米烊光
2025-03-06 05:36:33 (1月前)


让我们考虑以下几点

矩阵
</跨度>

[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]相对于身份进行切换

矩阵
</跨度>

从身份开始

矩阵
</跨度>
,我们怎样才能建立前一个

矩阵
</跨度>
使用切片鈥

4 条回复
  1. 0# 撩心 | 2019-08-31 10-32



    没有一个函数(我知道)将交换列的位置,因为您可以在发布时使用基本切片来执行此操作。您始终可以构建该类型的函数:




    1. def swap(arr, *tups, copy=False):
      ix = np.array(tups)
      if copy:
      arr = arr.copy()
      arr[ix.ravel()] = arr[ix[:,::-1].ravel()]
      return arr

    2. swap(np.eye(6), (0,2), (1,3))

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

    4. </code>


    如果你想要性能,我会建议使用稀疏矩阵。该

    csr_matrix

    存储非零列

    indices

    ,使切换列容易:




    1. 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())

    2. 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.]])

    3. </code>

  2. 1# 圈圈红 | 2019-08-31 10-32



    矢量解决方案可扩展到任何

    N





    1. N=2
      s = np.zeros((3N,3N))
      pattern = [[1,0,0],[0,0,1],[0,1,0]]
      s.reshape(N,3,N,3)[range(N),:,range(N),:] = pattern

    2. </code>


    对于




    1. 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.]])

    2. </code>

  3. 2# 不想吃东西 | 2019-08-31 10-32



    像这样的东西?



    1.   # helper function, swaps two rows
    2. def swaprows(arr, row1, row2):
      temp = arr[row1].copy()
      arr[row1] = arr[row2]
      arr[row2] = temp
      return arr

    3. a = np.eye(6)
      a = swaprows(a, 1, 2)
      a = swaprows(a, 4, 5)
      print(a)

    4. =>

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

      </code>


    请注意,python使用0索引,我猜你来自R或Matlab,你的最后一个代码块将a)不使用双括号和b)你会因为尝试索引大小数组而得到索引超出范围的错误6位于第6位。


登录 后才能参与评论