使用numpy.unravel_索引

2024-04-26 01:09:59 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我有一个2x4数组,叫做mi_respected。我使用argmax找出数组中最大元素的索引。现在我想把这些指数转换成x,y坐标。所以我用了numpy.unravel_指数。我得到这个错误:

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)

谢谢你


Tags: inpyindexnpline数组指数max
2条回答

为此,您应该跳过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)

现在,你告诉numpy给你维度1上最大值的索引,它找到了带有索引[3, 3]的最大值'3'和'7'。但是你的代码不应该有错误,只是错误的最终结果。

np.unravel_index需要一个整数作为其第一个参数。max_ix是一个数组。

此外,max_ix中的每个值是关于mi的第二轴(axis = 1)的索引。

请改为:

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

相关问题 更多 >