Tengo una matriz de datos 'NumPy' de la siguiente manera:

data = np.array([
[0.0, 30.0, 60.0, 90.0, 120.0, 150.0, -180.0, -150.0, -120.0, -90.0, -60.0, -30.0],
[0.0, 30.0, 60.0, 90.0, 120.0, 150.0, -180.0, -150.0, -120.0, -90.0, -60.0, -30.0],
[0.0, 30.0, 60.0, 90.0, 120.0, 150.0, -180.0, -150.0, -120.0, -90.0, -60.0, -30.0]])

Quiero producir la matriz 'resultado' a partir de la matriz dada 'datos'. En realidad, en la matriz requerida, la columna cero debe colocarse en el medio, luego los valores aumentan hacia la dirección correcta, mientras que los valores disminuyen en la dirección izquierda como se muestra a continuación:

result = np.array([
[-180.0, -150.0, -120.0, -90.0, -60.0, -30.0, 0.0, 30.0, 60.0, 90.0, 120.0, 150.0, 180.0],
[-180.0, -150.0, -120.0, -90.0, -60.0, -30.0, 0.0, 30.0, 60.0, 90.0, 120.0, 150.0, 180.0],
[-180.0, -150.0, -120.0, -90.0, -60.0, -30.0, 0.0, 30.0, 60.0, 90.0, 120.0, 150.0, 180.0]])

La matriz resultante debe basarse en la manipulación del índice de la matriz dada. ¿Cuál es la mejor manera de hacerlo en NumPy?

Intenté np.rot90, np.flipud, np.fliprl funciones sin éxito.

Sin embargo, no se me ocurrió cómo empezar.

1
user3981344 27 ago. 2014 a las 20:35

2 respuestas

La mejor respuesta

Eche un vistazo a np.roll:

np.roll(data, shift=data.shape[1]//2, axis=1)

Aquí shift dice cuántos elementos se deben rodar los datos (valores positivos a la derecha, negativos a la izquierda). Dada la especificación, queremos rodar hacia la derecha la mitad de la longitud de la matriz a lo largo de la segunda dimensión (axis=1). // es una división entera, y data.shape[1] obtiene el tamaño de la dimensión a lo largo de la segunda dimensión (en función de la indexación cero).

Sin embargo, creo que te falta el valor +180.0 que tienes en result en data (es decir, tu result tiene 13 columnas, pero tu data solo tiene 12)

In [9]: data = np.array([
[0.0, 30.0, 60.0, 90.0, 120.0, 150.0, -180.0, -150.0, -120.0, -90.0, -60.0, -30.0],
[0.0, 30.0, 60.0, 90.0, 120.0, 150.0, -180.0, -150.0, -120.0, -90.0, -60.0, -30.0],
[0.0, 30.0, 60.0, 90.0, 120.0, 150.0, -180.0, -150.0, -120.0, -90.0, -60.0, -30.0]])

In [10]: result = np.roll(data, data.shape[1]//2, axis=1)

In [11]: result
Out[11]:
array([[-180., -150., -120.,  -90.,  -60.,  -30.,    0.,   30.,   60.,
          90.,  120.,  150.],
       [-180., -150., -120.,  -90.,  -60.,  -30.,    0.,   30.,   60.,
          90.,  120.,  150.],
       [-180., -150., -120.,  -90.,  -60.,  -30.,    0.,   30.,   60.,
          90.,  120.,  150.]])

Esto no es realmente una clasificación basada en el índice, pero dados los otros métodos que probó, supongo que esta es la manipulación de tipos que puede desear.

1
JoshAdel 27 ago. 2014 a las 16:53

Entonces, ¿supongo que está tratando de ordenar esta matriz de menor a mayor valor? No está del todo claro a partir de su pregunta. ¿Prueba esto?

result = []
for row in data:
    result.append(np.sort(row))

Puede usar las funciones en numpy para convertir fácilmente el 'resultado' en una matriz numpy nuevamente. Hay más información sobre np.sort disponible aquí

0
Alex Alifimoff 27 ago. 2014 a las 16:45