используя numpy.unravel_index - PullRequest
       0

используя numpy.unravel_index

3 голосов
/ 01 марта 2012

Привет, у меня есть массив 2x4 с именем mi_reshaped.Я использовал argmax, чтобы узнать значения самых больших элементов в моем массиве.Теперь я хочу преобразовать эти значения в координаты x, y.Поэтому я использовал 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 ]

5 голосов
/ 01 марта 2012

Вы должны пропустить 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» и «7» с индексами [3, 3].Тем не менее, вы не должны получить ошибку с вашим кодом, просто неверный конечный результат.

2 голосов
/ 01 марта 2012

np.unravel_index ожидает целое число в качестве первого аргумента. max_ix - это массив.

Более того, каждое значение в max_ix является индексом по второй оси (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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...