2016-04-12 3 views
1

Так что я пытаюсь сортировать многомерный массив элементов в python. Массив - это беспорядок, что и делает его настолько сложным, но, к сожалению, это то, что возвращает функция opencv.Сортировка многомерного размерного массива координат x, y в python

Это у, координаты х (назад я знаю ....)

[array([[[ 13, 178]],[[ 50, 179]],[[ 49, 258]],[[ 12, 257]]]), 
array([[[ 58, 93]],[[105, 94]],[[104, 171]],[[ 57, 170]]]), 
array([[[ 13, 93]],[[ 50, 94]],[[ 49, 171]],[[ 12, 170]]]), 
array([[[ 58, 9]],[[105, 10]],[[104, 86]],[[ 57, 85]]]), 
array([[[13, 9]], [[50, 10]],[[49, 86]],[[12, 85]]]), 
array([[[ 58, 178]],[[105, 179]],[[104, 257]],[[ 57, 257]]])] 

Теперь путь мне нужно это сортируется является первым элементом каждого Numpy массива (позволяет называть его), и затем ВТОРОЙ элемент a в DESCENDING. И мне нужно, чтобы все связи были разбиты на ПЕРВЫЙ элемент a в порядке ASCENDING.

Так что это будет в конечном итоге

[array([[[ 13, 178]],[[ 50, 179]],[[ 49, 258]],[[ 12, 257]]]), 
array([[[ 58, 178]],[[105, 179]],[[104, 257]],[[ 57, 257]]]), 
array([[[ 13, 93]],[[ 50, 94]],[[ 49, 171]],[[ 12, 170]]]), 
array([[[ 58, 93]],[[105, 94]],[[104, 171]],[[ 57, 170]]]), 
array([[[13, 9]], [[50, 10]],[[49, 86]],[[12, 85]]]), 
array([[[ 58, 9]],[[105, 10]],[[104, 86]],[[ 57, 85]]])] 

Теперь я понял, как получить доступ к этим элементам с помощью

items[each][first][0][Y_POS(or X_POS)] 

, где каждый является nparray доступа (есть 6 из них) и Y_POS относится к позиции y, а X_POS относится к позиции x.

Остальные две переменные сначала и 0 никогда не будут меняться.

Я действительно не знаю, с чего начать, чтобы он работал эффективно, поэтому любая помощь приветствуется. Имейте в виду, что координаты обозначаются Y, X.

Заранее благодарен всем.

ответ

0

Учитывая, что А является 4d массив, содержащий все ваши данные:

I = np.argsort(A[:, 0, 0, 0]) 
A = A[I[::-1]] 
I = np.argsort(A[:, 0, 0, 1], kind='mergesort') 
A = A[I[::-1]] 

Сначала мы сортируем по Y в обратном порядке, то сортировать по X в обратном порядке тоже, в результате чего в порядке убывания в X, но по возрастанию в Y когда X равно. Обратите внимание, что мы должны использовать стабильный алгоритм сортировки, чтобы предотвратить скремблирование результатов от нашей первой сортировки; mergesort должен делать трюк.

Смежные вопросы