2010-11-06 9 views
8

numpy.unravel_index() toma una forma y un índice plano en una matriz, y devuelve la tupla que representa ese índice en la matriz. ¿Hay un inverso? Puedo calcularlo a mano, pero parece que debe ser una función incorporada en alguna parte ...¿Tiene NumPy un inverso de unravel_index()?

+1

Creo que debería actualizar la respuesta aceptada para el uso de 'ravel_multi_index'; la mayoría de la gente usará 'NumPy 1.6' o más reciente por ahora. – gerrit

Respuesta

7

Desde numpy 1.6.0 (mayo de 2011) no es una función integrada de NumPy ravel_multi_index

Convierte una tupla de matrices de índice en una matriz de índices planos, aplicando modos de límites a la multi-índice.

(Esto también es mencionado en un comentario por el usuario Bi Rico, pero realmente debería aparecer como una respuesta)

2
+1

No fiable. Cuando toma segmentos de matrices, Numpy a menudo comparte los mismos datos y hace trucos de zancadas. Compara arange (15) .reshape ((3,5)). Strides (esta será una buena matriz contigua) y arange (35) .reshape ((7,5)) [1 :: 2,:]. Strides . –

+0

Es cierto, y la falta de visibilidad en eso puede ser un verdadero dolor. Pero si estás planeando hacer tus propios trucos (como estuve aquí), con suerte puedes garantizar que el conjunto sea contiguo. – D0SBoots

3

Esto funciona:

def ravel_index(pos, shape): 
    res = 0 
    acc = 1 
    for pi, si in zip(reversed(pos), reversed(shape)): 
     res += pi * acc 
     acc *= si 
    return res 
1

No está construido en un comando, pero siempre he utilizado el siguiente fragmento, suponiendo que se utiliza por defecto la indexación por filas de numpy:

np.sum(np.array(index_tuple[:-1])*np.array(a_matrix.shape[1:]))+np.array(index_tuple[-1]) 

a igual Fortan indexación (columna-principal), los índices sólo tiene que ser intercambiado:

np.sum(np.array(index_tuple[1:])*np.array(a_matrix.shape[:-1]))+np.array(index_tuple[0]) 

En lo anterior, index_tuple y a_matrix son una tupla que contiene los índices de interés y la matriz que se indexa, respectivamente. Esto no tiene el problema anterior asociado con zancadas cuando se toman rodajas.

+2

A partir de numpy 1.6 es un comando integrado 'numpy.ravel_multi_index', http://docs.scipy.org/doc/numpy/reference/generated/numpy.ravel_multi_index.html pero esta pregunta es bastante antigua. –

+0

Gracias, no había notado el nuevo comando, así que esto es muy útil para mí. –