MATLAB ind2sub和Numpy unravel_index不一致

时间:2016-09-13 08:10:52

标签: python matlab numpy

基于following answer

使用Octave,我得到:

>> [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?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

对于跟随列主要索引的MATLAB,对于(x,y,z),元素存储在x,然后是y,然后是z。对于(x,y,z)的NumPy,因为行主索引,而另一种方式是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)