Сортировка массивов Python (Numpy) - PullRequest
7 голосов
/ 19 февраля 2011

У меня есть этот массив с именем v, dtype ('float64'):

array([[  9.33350000e+05,   8.75886500e+06,   3.45765000e+02],
       [  4.33350000e+05,   8.75886500e+06,   6.19200000e+00],
       [  1.33360000e+05,   8.75886500e+06,   6.76650000e+02]])

..., который я получил из файла с помощью команды np.loadtxt.Я хотел бы отсортировать его по значениям первого столбца, не смешивая структуру, в которой числа, перечисленные в одной строке, объединены.Использование v.sort (axis = 0) дает мне:

array([[  1.33360000e+05,   8.75886500e+06,   6.19200000e+00],
       [  4.33350000e+05,   8.75886500e+06,   3.45765000e+02],
       [  9.33350000e+05,   8.75886500e+06,   6.76650000e+02]])

... т.е. помещает наименьшее число третьего столбца в первую строку и т. Д. Я бы предпочел что-то подобное ...

array([[  1.33360000e+05,   8.75886500e+06,   6.76650000e+02],
       [  4.33350000e+05,   8.75886500e+06,   6.19200000e+00],
       [  9.33350000e+05,   8.75886500e+06,   3.45765000e+02]])

... где элементы каждой строки не были перемещены относительно друг друга.

Ответы [ 3 ]

13 голосов
/ 19 февраля 2011

Попробуйте

v[v[:,0].argsort()]

(с массивом v). v[:,0] - это первый столбец, а .argsort() возвращает индексы, которые будут сортировать первый столбец. Затем вы применяете этот порядок ко всему массиву, используя расширенную индексацию. Обратите внимание, что вы получаете сортированную копию массива.

Единственный известный мне способ сортировки массива - использовать запись типа d:

v.dtype = [("x", float), ("y", float), ("z", float)]
v.shape = v.size
v.sort(order="x")
5 голосов
/ 19 февраля 2011

С другой стороны

Попробуйте

import numpy as np

order = v[:, 0].argsort()
sorted = np.take(v, order, 0)

'order' имеет порядок первой строки. а затем 'np.take' возьмите столбцы в соответствующем порядке.

См. Справку 'np.take' как

help(np.take)

take (a, indexes, axis = None, out = None, Режим = «поднять») Возьмите элементы из массива вдоль оси.

This function does the same thing as "fancy" indexing (indexing arrays
using arrays); however, it can be easier to use if you need elements
along a given axis.

Parameters
----------
a : array_like
    The source array.
indices : array_like
    The indices of the values to extract.
axis : int, optional
    The axis over which to select values. By default, the flattened
    input array is used.
out : ndarray, optional
    If provided, the result will be placed in this array. It should
    be of the appropriate shape and dtype.
mode : {'raise', 'wrap', 'clip'}, optional
    Specifies how out-of-bounds indices will behave.

    * 'raise' -- raise an error (default)
    * 'wrap' -- wrap around
    * 'clip' -- clip to the range

    'clip' mode means that all indices that are too large are

заменен по индексу, который обращается к последнему элементу вдоль этой оси. Заметка что это отключает индексирование с отрицательными числами.

Returns
-------
subarray : ndarray
    The returned array has the same type as `a`.

See Also
--------
ndarray.take : equivalent method

Examples
--------
>>> a = [4, 3, 5, 7, 6, 8]
>>> indices = [0, 1, 4]
>>> np.take(a, indices)
array([4, 3, 6])

In this example if `a` is an ndarray, "fancy" indexing can be used.

>>> a = np.array(a)
>>> a[indices]
array([4, 3, 6])
0 голосов
/ 19 февраля 2011

Если у вас есть экземпляры, в которых v[:,0] имеет несколько идентичных значений, и вы хотите вторично отсортировать по столбцам 1, 2 и т. Д., Тогда вы захотите использовать numpy.lexsort() или numpy.sort(v, order=('col1', 'col2', etc..), но для случая order=, v должен быть структурированным массивом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...