2013-07-26 3 views
0

Я хочу перебрать Numpy массив, начиная с индексом наибольшего значения рабочего до самого низкого значенияперебрать Numpy массива в определенном порядке на основании значений

import numpy as np #imports numpy package 

elevation_array = np.random.rand(5,5) #creates a random array 5 by 5 

print elevation_array # prints the array out 

ravel_array = np.ravel(elevation_array) 
sorted_array_x = np.argsort(ravel_array) 
sorted_array_y = np.argsort(sorted_array_x) 

sorted_array = sorted_array_y.reshape(elevation_array.shape) 

for index, rank in np.ndenumerate(sorted_array): 
    print index, rank 

Я хочу это напечатать:

индекс самого высокого значения индекса следующего самого высокого значения индекса следующего самого высокого значения и т.д.

ответ

1

Попробуйте это:

from operator import itemgetter 

>>> a = np.array([[2, 7], [1, 4]]) 
array([[2, 7], 
     [1, 4]]) 

>>> sorted(np.ndenumerate(a), key=itemgetter(1), reverse=True) 
[((0, 1), 7), 
((1, 1), 4), 
((0, 0), 2), 
((1, 0), 1)] 

вы можете повторить этот список, если хотите. По сути, я говорю функции sorted для заказа элементов np.ndenumerate(a) в соответствии с ключом itemgetter(1). Эта функция itemgetter получает второй (индекс 1) элемент из кортежей ((0, 1), 7), ((1, 1), 4), ... (то есть значения), генерируемые np.ndenumerate(a).

+0

+1, потому что вы избили меня за секунду :) – dkar

+0

Привет elyase и dkar спасибо. Мне было интересно, не могли бы вы объяснить это мне немного? Я все еще очень новичок в numpy и python. –

+0

@ NickJones, Конечно, я только что обновил ответ. – elyase

2

Если вы хотите NumPy делать тяжелую работу, вы можете сделать что-то вроде этого:

>>> a = np.random.rand(100, 100) 
>>> sort_idx = np.argsort(a, axis=None) 
>>> np.column_stack(np.unravel_index(sort_idx[::-1], a.shape)) 
array([[13, 62], 
     [26, 77], 
     [81, 4], 
     ..., 
     [83, 40], 
     [17, 34], 
     [54, 91]], dtype=int64) 

Вы сначала получить индекс, который сортирует весь массив, а затем преобразовать этот плоский индекс в пар индексов с np.unravel_index , Вызов np.column_stack просто соединяет два массива координат в один и может быть заменен на Python zip(*np.unravel_index(sort_idx[::-1], a.shape)), чтобы получить список кортежей вместо массива.