2011-08-28 15 views
6

que he encontrado el siguiente comportamiento desconcertante con NumPy y una dtype personalizada para un ndarray:NumPy: array problema de asignación cuando se utiliza dtype encargo

import numpy as np 

# Make a custom dtype with a single triplet of floats (my actual dtype has other 
# components, but this suffices to demonstrate the problem. 
dt = np.dtype([('a', np.float64, 3)]) 

# Make a zero array with this dtype: 
points = np.zeros((4, 4), dtype=dt) 

# Try to edit an entry: 
points[0][0]['a'] = np.array([1, 1, 1]) 

print points[0][0]['a'] 

Ahora bien, esta regresa como que no contenga [1. 1. 1.] como era de esperar, pero en cambio [1. 0. 0.], solo realizando la asignación en la primera coordenada. Puedo evitar esto al realizar la asignación en forma coordinada, pero parece innecesario dado que la asignación completa debería ser el comportamiento predeterminado en este caso.

¿Alguna idea de lo que está pasando aquí?

Respuesta

2

Hay muchas método para asignar puntos, si desea que su método funciona:

points[0][0]['a'][:] = np.array([1, 1, 1]) 

o:

points[0,0]['a'][:] = np.array([1, 1, 1]) 

porque los puntos [0,0] [ 'a'] es una matriz , si desea cambiar el contenido de la matriz, debe usar el índice.

+0

Justo lo que estaba buscando, gracias. –

3

Si cambia el orden de los índices, como este: points['a'][0][0] = np.array([1, 1, 1]), funciona bien para mí (python 2.6.5, numpy 1.3.0 en Ubuntu 10.04). Desearía saber por qué.

+0

Funciona para mí también. Aunque lo que realmente hubiera querido hacer sería algo como: p = puntos [0] [0] p ['a'] = np.array ([1, 1, 1]) Y otras manipulaciones en p si es necesario. –

+0

@Tim: AFAIK, parece natural especificar primero la columna con nombre, y solo entonces buscar los índices numéricos. De esta manera, la capacidad de escribir ya sea puntos ['a'] [0] o puntos [0] ['a'] (que funciona para matrices dtype-ed de POD) se siente como un almuerzo gratis para mí. –

Cuestiones relacionadas