Matlab 如何获取numpy数组的线性索引(sub2ind)

Matlab 如何获取numpy数组的线性索引(sub2ind),matlab,numpy,Matlab,Numpy,Matlab提供了一个函数,该函数“返回矩阵的行和列下标的线性索引等价物…” 我需要这个sub2ind函数或类似的函数,但我没有找到任何类似的Python或Numpy函数。如何获得此功能 这是(与上述页面相同)中的一个示例: 这就是我为自己解决问题的方式,重写为类似于上面给出的示例 主要思想是使用arange和restrape创建一个带有索引的助手数组 In [1]: import numpy as np In [2]: A = np.random.rand(3,4,2) In [3]: A

Matlab提供了一个函数,该函数“返回矩阵的行和列下标的线性索引等价物…”

我需要这个
sub2ind
函数或类似的函数,但我没有找到任何类似的Python或Numpy函数。如何获得此功能

这是(与上述页面相同)中的一个示例:


这就是我为自己解决问题的方式,重写为类似于上面给出的示例

主要思想是使用
arange
restrape
创建一个带有索引的助手数组

In [1]: import numpy as np

In [2]: A = np.random.rand(3,4,2)

In [3]: A
Out[3]: 
array([[[ 0.79341698,  0.55131024],
        [ 0.29294586,  0.22209375],
        [ 0.11514749,  0.15150307],
        [ 0.71399288,  0.11229617]],

       [[ 0.74384776,  0.96777714],
        [ 0.1122338 ,  0.23915265],
        [ 0.28324322,  0.7536933 ],
        [ 0.29788946,  0.54770654]],

       [[ 0.13496253,  0.24959013],
        [ 0.36350264,  0.00438861],
        [ 0.77178808,  0.66411135],
        [ 0.26756112,  0.54042292]]])

In [4]: helper = np.arange(3*4*2)

In [5]: helper
Out[5]: 
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23])

In [6]: helper = helper.reshape([3,4,2])

In [7]: helper
Out[7]: 
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5],
        [ 6,  7]],

       [[ 8,  9],
        [10, 11],
        [12, 13],
        [14, 15]],

       [[16, 17],
        [18, 19],
        [20, 21],
        [22, 23]]])

In [8]: linear_index = helper[1,0,1]

In [9]: linear_index
Out[9]: 9
请注意:

  • 行和列在Numpy中根据Matlab进行切换
  • Matlab以1开始索引,Python和Numpy以0开始索引
    • 我想你想用。使用numpy的基于零的索引,并考虑到matlab数组是Fortran风格的,与您的matlab示例等效的是:

      >>> np.ravel_multi_index((1, 0, 1), dims=(3, 4, 2), order='F')
      13
      
      为了让你明白发生了什么,你可以用指数的点积和数组的步长得到相同的结果:

      >>> a = np.random.rand(3, 4, 2)
      >>> np.dot((1, 0, 1), a.strides) / a.itemsize
      9.0
      >>> np.ravel_multi_index((1, 0, 1), dims=(3, 4, 2), order='C')
      9
      >>> a[1, 0, 1]
      0.26735433071594039
      >>> a.ravel()[9]
      0.26735433071594039
      

      这有点误导。这使您看起来需要知道数组的内存布局才能使用平面索引,而平面索引并非如此。Strips方法只适用于C-连续数组,但这始终是正确的:
      A[idx]==A.flat[flat\u idx]==A.ravel()[flat\u idx]
      如果
      flat\u idx=np.ravel\u多索引(idx,A.shape)
      。值得注意的是,
      flat_idx
      在matlab和numpy中的计算方式不同。
      >>> a = np.random.rand(3, 4, 2)
      >>> np.dot((1, 0, 1), a.strides) / a.itemsize
      9.0
      >>> np.ravel_multi_index((1, 0, 1), dims=(3, 4, 2), order='C')
      9
      >>> a[1, 0, 1]
      0.26735433071594039
      >>> a.ravel()[9]
      0.26735433071594039