使用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?
答案 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,因为行主索引,而另一种方式是z
,y
,然后是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)