【问题标题】:MATLAB ind2sub and Numpy unravel_index inconsistencyMATLAB ind2sub 和 Numpy unravel_index 不一致
【发布时间】:2016-09-13 08:10:52
【问题描述】:

基于following answer

使用八度,我得到:

>> [x, y, z] = ind2sub([27, 5, 58], 3766)
x =  13
y =  5
z =  28

使用 Numpy,我得到:

>>> import numpy as np
>>> np.unravel_index(3765, (27, 5, 58))
(12, 4, 53)

为什么在 Numpy 中,z 分量是 58,而根据八度音程应该是 27?

【问题讨论】:

    标签: python matlab numpy


    【解决方案1】:

    对于遵循列主要索引的 MATLAB,对于 (x,y,z),元素存储在 x,然后是 y,然后是 z。使用 NumPy for (x,y,z) 因为行主要索引,它是另一种方式 - zy,然后是 x。因此,要在 NumPy 中复制相同的行为,您需要翻转网格形状以与 np.unravel_index 一起使用,最后翻转输出索引,如下所示 -

    np.unravel_index(3765, (58, 5, 27))[::-1]
    

    示例运行 -

    In [18]: np.unravel_index(3765, (58, 5, 27))[::-1]
    Out[18]: (12, 4, 27)
    

    【讨论】:

    • 如此简单。谢谢!
    【解决方案2】:

    Matlab 遵循列优先(Fortran 风格)排序,而 NumPy 遵循行优先(C 风格)排序。

    NumPy 函数unravel_index(indices, dims, order='C') 有一个可选参数order,它决定索引是否应被视为行优先(C 风格)或列优先(Fortran 风格)顺序的索引。默认为order='C'

    [x, y ,z] = np.unravel_index(3765, (27, 5, 58))                 # x=12, y=4, z=53
    [x, y ,z] = np.unravel_index(3765, (27, 5, 58), order='F')      # x=12, y=4, z=27
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      • 2020-07-12
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多