如何获取numpy数组的线性索引(sub2ind) [英] How to get the linear index for a numpy array (sub2ind)

查看:457
本文介绍了如何获取numpy数组的线性索引(sub2ind)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Matlab提供 sub2ind 函数,该函数返回"线性索引等效于矩阵的行和列下标...."

Matlab offers the function sub2ind which "returns the linear index equivalents to the row and column subscripts ... for a matrix... ."

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

I need this sub2ind function or something similar, but I did not find any similar Python or Numpy function. How can I get this functionality?

这是 matlab文档中的示例(与上述页面相同):

This is an example from the matlab documentation (same page as above):

Example 1

This example converts the subscripts (2, 1, 2) for three-dimensional array A 
to a single linear index. Start by creating a 3-by-4-by-2 array A:

rng(0,'twister');   % Initialize random number generator.
A = rand(3, 4, 2)

A(:,:,1) =
    0.8147    0.9134    0.2785    0.9649
    0.9058    0.6324    0.5469    0.1576
    0.1270    0.0975    0.9575    0.9706
A(:,:,2) =
    0.9572    0.1419    0.7922    0.0357
    0.4854    0.4218    0.9595    0.8491
    0.8003    0.9157    0.6557    0.9340

Find the linear index corresponding to (2, 1, 2):

linearInd = sub2ind(size(A), 2, 1, 2)
linearInd =
    14
Make sure that these agree:

A(2, 1, 2)            A(14)
ans =                 and =
     0.4854               0.4854

推荐答案

我认为您想使用

I think you want to use np.ravel_multi_index. With the zero based indexing of numpy, and taking into account that matlab arrays are Fortran style, the equivalent to your matlab example is:

>>> np.ravel_multi_index((1, 0, 1), dims=(3, 4, 2), order='F')
13

只要您了解发生了什么,就可以通过索引的点积和数组的步幅得到相同的结果:

Just so you understand what is going on, you could get the same result with the dot product of your indices and the strides of the array:

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

这篇关于如何获取numpy数组的线性索引(sub2ind)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆