2012-03-01 6 views
3

こんにちは私はmi_reshapedという2x4配列を持っています。 argmaxを使用して、配列内の最大の要素の索引を見つけました。今私はこれらのindecesをx、y座標に変換したいと思います。だから私はnumpy.unravel_indexを使いました。私はこのエラーを取得する:numpy.unravel_indexを使用

Traceback (most recent call last): 
File "CAfeb.py", line 273, in <module> 
analyzeCA('full', im) 
File "CAfeb.py", line 80, in analyzeCA 
bg_params = parameterSearch(im, [3, 2], roi, ew, hist_sz, w_data); 
File "CAfeb.py", line 185, in parameterSearch 
ix = np.unravel_index(max_ix, mi_reshaped.shape)#(mi.size) 
File "/usr/lib/pymodules/python2.7/numpy/lib/index_tricks.py", line 64, in unravel_index 
if x > _nx.prod(dims)-1 or x < 0: 
ValueError: The truth value of an array with more than one element isambiguous. 
    a.any() or a.all() 
mi_reshaped=mi.reshape(2,4) 
max_ix = np.argmax(mi_reshaped, axis=1) 
ix = np.unravel_index(max_ix, mi_reshaped.shape)#(mi.size) 

答えて

2

np.unravel_indexはその最初の引数として整数を期待していただきありがとうございます。 max_ixは配列です。

また、max_ixの各値は、第2軸(axis = 1)に対するインデックスであり、miである。

ではなく、試してみてください。たとえば

ix = [(row, ix) for row, ix in enumerate(max_ix)] 

を、

In [89]: mi_reshaped = np.array(range(8)).reshape(2, 4) 
In [90]: mi_reshaped 
Out[90]: 
array([[0, 1, 2, 3], 
     [4, 5, 6, 7]]) 

In [91]: max_ix = np.argmax(mi_reshaped, axis=1) 

In [92]: max_ix 
Out[92]: array([3, 3]) 

In [93]: ix = [(row, ix) for row, ix in enumerate(max_ix)] 

In [94]: ix 
Out[94]: [(0, 3), (1, 3)] 
+0

ありがとうございます@unutbu –

5

あなたはこのためaxis=1をスキップする必要があります。 numpy.argmax(array)を実行すると、フラット化された配列でmaxが検索され、unravel_indexを配列の形で実行して実際のインデックスを見つけることができます。軸を渡すと、numpyは配列内の各エントリの軸の最大値を探します。たとえば、次のように

>>>data = numpy.array(range(8)).reshape(2, 4) 
>>>data 
array([[0, 1, 2, 3], 
     [4, 5, 6, 7]]) 
>>>max_ix = numpy.argmax(data, axis=1) 
>>>max_ix 
array([3, 3]) 
>>>numpy.unravel_index(max_ix, data.shape) 
(array([0, 0]), array([3, 3])) 

今、あなたは軸をスキップした場合:

>>>max_ix = numpy.argmax(data) 
>>>max_ix 
7 
>>>numpy.unravel_index(max_ix, data.shape) 
(1, 3) 

今何が起こったことは、あなたがあなたの次元1上の最大値のインデックスを与えるためにnumpyのを告げ、それが最大値「3」を発見していますインデックスは[3, 3]で '7'です。まだ間違った最終結果だけでは、あなたのコードでエラーを得るべきではありません。

+0

ありがとうございます。私はPythonにいくつかのmatlabのコードを変換しようとしていた彼らは座標を取得するためにind2subを使用しました。しかし、彼らは3つの座標を持っていました - 例:[ix、jx、kx] = ind2sub(size(mi)、max_ix); –

関連する問題