2013-03-05 21 views
13

Matlabは、 "行列の行と列の添え字に等しい線形インデックスを返します..."という関数sub2indを提供しています。numpy配列(sub2ind)の線形インデックスを取得する方法

私はこれを必要としますsub2ind機能またはそれに類似するが、私は同様のPythonまたはNumpyの機能を見つけることができませんでした。どのようにしてこの機能を利用できますか?

これは(上記と同じページ)matlab documentationからの例です:

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 

答えて

20

で1、Pythonとnumpyの持つインデックスを開始し、私はあなたがnp.ravel_multi_indexを使用したいと思います。ゼロベースのnumpyののインデックス、およびMATLAB配列は、Fortranスタイルであることを考慮に入れてで、あなたのMathWorks社の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 
+3

これは少し誤解を招く。これは、あなたが真ではないフラクタルインデックスを使うために配列のメモリレイアウトを知る必要があるように見えます。 stridesメソッドはC連続配列に対してのみ有効ですが、これは常に真です: 'A [idx] == A.flat [flat_idx] == A.ravel()[flat_idx]' 'flat_idx = np.ravel_multi_index (idx、A.shape) 'である。 flat_idxはmatlabとnumpyで異なって計算されますが、注意するのは良いことです。 –

1

これは私が上記の例と似ているように書き換えられ、私のために問題を解決した方法です。

主な考え方は、arangereshapeを使用してインデックスを持つヘルパー配列を作成することです。

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 

なお:

  • 行と列は、Matlabのにに関するnumpyのに切り替えています。
  • MATLABは0
関連する問題