Matlab 如何获取numpy数组的线性索引(sub2ind)
Matlab提供了一个函数,该函数“返回矩阵的行和列下标的线性索引等价物…” 我需要这个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
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