2014-09-23 2 views
1
Tool = [[0 for x in xrange(3)] for y in xrange(len(xTool)-1)] 
for l in xrange((len(xTool) - 1)): 
    Tool[l][0] = yTool[l]; Tool[l][1] = xTool[l]; Tool[l][2] = zTool[l] 

Я начинаю с координатами точек, которые находятся в 3 списках (Xtool, yTool, zTool), что составляет соответственно х, у и г координаты всех моих точек.Как сортировать двумерный массив в питоне

Целью здесь является создание матрицы из 3 столбцов и множества строк (более 10 000), где каждая строка представляет 3 координаты точки. Следующий шаг я делаю, это вектор преобразования следующим образом: (Это имеет незначительное значение, только если вы действительно хотите понять, что я делаю

rTool = numpy.zeros_like(Tool) 
for rt in xrange((len(xTool) - 1)): 
    rTool[rt][0] = (Tool[rt][0] * cos(angle)) - (Tool[rt][1] * sin(angle)) 
    rTool[rt][1] = (Tool[rt][0] * sin(angle)) + (Tool[rt][1] * cos(angle)) 
    rTool[rt][2] = Tool[rt][2] 

Наконец, то, что я пытаюсь сделать, это заказать мой rTool в отношении моего 2-го столбца ([1]). Например, я напечатал 5 записей моего rTool. Сортируя их в соответствии со вторым столбцом, последняя строка должна быть первой. Я действительно изо всех сил пытаюсь это сделать, и я подозреваю, что это потому, что у меня есть кортежи вместо реальной 3 столбца математической матрицы.

[[ -584.89837646 -3648.6472168 402.177948 ] 
[ -542.8659668 -3663.34545898 405.76959229] 
[ -500.831604 -3678.04785156 409.32122803] 
[ -458.79336548 -3692.75854492 412.7930603 ] 
[ -416.74984741 -3637.48022461 416.15090942]] 

не стесняйтесь попросить clarificati и надеюсь, вы сможете мне помочь! Благодарю.

+0

аналогичный вопрос, заданный 5 лет назад http://stackoverflow.com/questions/613183/sort-a-python-dictionary-by-value –

+0

Вы можете использовать кортежи для координат, так что вы имели бы список троек '[(x, y, z,) (x, y, z)]'. Кортежи неизменны, но быстрее. – data

ответ

1

Прежде всего, научиться NumPy. Выполнение такого рода вещей в простом питоне идет вразрез со всем питоническим.

После того, как вы сделали это:

sorted_rtool = rTool[np.argsort(rTool[:,1])] 

Гнать важность Numpy дома:

rTool = np.dot(Tool, R) 

не только намного чище, его также на несколько порядков быстрее.

+0

Почему это происходит * против всего pythonic *? – will

+0

«Все» - большое слово, но его просто неправильный инструмент для работы во всех отношениях можно вообразить. Переосмысление таких вещей, как матричное умножение в python, является плохим случаем для переосмысления колеса для стартеров. Кроме того, он скрывает намерение вашего кода, он гораздо более подвержен ошибкам, и производительность гарантированно страдает на порядки. –

+0

Я бы сказал, что это часто верно, но мне действительно не нравится способ, которым 'numpy' повторно использует' np.dot() 'для умножения матрицы и суммирует продукты, а также только точечный продукт. Я бы сказал, что это неряшливо, поскольку оно обдумывает, что происходит на самом деле. Если вы скажете «использовать numpy, потому что вы можете сделать его более питоническим, а не изобретать колесо», то вам следует рекомендовать использовать класс «matrix», а затем вам просто нужно сделать «M * N», чтобы достичь чего вы хотите. Я бы сказал, что это более pythonic, потому что 'np.dot (M, N)' – will

0

Вы ищете для ключевого слова keylist.sort() (или встроенный sorted()) Посмотрите на Key Functions раздел here.

Часто люди используют функцию лямбда для ключа сортировки, так как она кратка, и вы часто не используете функцию сортировки более одного раза. Все, что есть, - это функция, которая возвращает объект key, на котором отсортирован каждый элемент списка.

Так что вы можете сделать:

def keyFunc(element): 
    return element[1] 

rTool.sort(key=keyFunc) 

или:

rTool.sort(key=lambda x: x[1]) 

В обоих случаях можно использовать rTool = sorted(rTool, key=...) вместо этого, разница в том, что list.sort() делает Inplace рода, и является более эффективным, если вам не нужен исходный массив.

key функция действительно может быть все, что вы хотите, при условии, что возвращает что-то другое, что может быть отсортирован, поэтому, если ваши очки были объекты с x, y, z атрибутами, то вы могли бы сделать rTool.sort(key x: x.y)

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