2011-02-18 26 views
7

Tengo esta matriz, llamada V, de dtype ('float64'):Python (Numpy) matriz de clasificación

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]]) 

... lo que he adquirido desde un archivo mediante el uso de la NP. comando loadtxt. Me gustaría ordenarlo después de los valores de la primera columna, sin mezclar la estructura que mantiene unidos los números en la misma línea. Usando v.sort (eje = 0) me da:

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]]) 

... es decir, coloca el número más pequeño de la tercera columna de la primera línea, etc. yo preferiría que desee algo como esto ...

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]]) 

... donde los elementos de cada línea no se han movido relativamente el uno al otro.

Respuesta

13

Trate

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

(con v siendo la matriz). v[:,0] es la primera columna y .argsort() devuelve los índices que ordenarían la primera columna. A continuación, aplica este orden a toda la matriz mediante la indexación avanzada. Tenga en cuenta que obtiene una copia sorteada de la matriz.

La única forma que conozco para ordenar la matriz en su lugar es utilizar un dtype registro:

v.dtype = [("x", float), ("y", float), ("z", float)] 
v.shape = v.size 
v.sort(order="x") 
5

Alternativamente

Trate

import numpy as np 

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

'orden' tiene el fin de la primera fila. y luego 'np.take' toma las columnas su orden correspondiente.

Consulte la ayuda de 'np.take' como

help(np.take) 

toma (a, índices, eje = Ninguno, salida = Ninguno, mode = 'levantar') Take elementos de una matriz a lo largo de un eje.

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 

sustituye por el índice que se ocupa el último elemento a lo largo de ese eje. Tenga en cuenta que esto inhabilita la indexación con números negativos.

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]) 
Cuestiones relacionadas