我想迭代一个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
我希望它打印出来:
最高值的索引 下一个最高值的索引 下一个最高值的索引等
答案 0 :(得分:2)
试试这个:
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
从((0, 1), 7), ((1, 1), 4),
生成的元组np.ndenumerate(a)
...(即值)中获取第二个(索引1)元素。
答案 1 :(得分:2)
如果你想要笨蛋做重物,你可以这样做:
>>> 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))
替换,以获取元组列表而不是数组。