2011-08-28 12 views
6

znalazłem następujący zaskakujący zachowanie z NumPy i niestandardową dtype dla ndarray:NumPy: tablica kwestia przypisania przy użyciu niestandardowego dtype

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

Teraz, to wraca jako zawierający nie [1. 1. 1.] jak można się spodziewać, ale zamiast tego [1. 0. 0.], wykonując zadanie tylko na pierwszej współrzędnej. Mogę to obejść, wykonując zadanie współrzędnych, ale wydaje się to niepotrzebne, ponieważ całe zadanie powinno z pewnością być domyślnym zachowaniem w tym przypadku.

Jakieś myśli o tym, co się tutaj dzieje?

Odpowiedz

2

Istnieje wiele sposób, aby przypisać punkty, jeśli chcesz, aby Twój sposób działa:

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

lub:

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

ponieważ punkty [0,0] [ 'a'] jest tablicą , jeśli chcesz zmienić zawartość tablicy, użyj indeksu.

+0

Właśnie tego szukałem, dziękuję. –

3

Jeśli zmienisz kolejność indeksów, na przykład: points['a'][0][0] = np.array([1, 1, 1]), wszystko działa dobrze (python 2.6.5, numpy 1.3.0 na Ubuntu 10.04). Chciałbym wiedzieć dlaczego.

+0

Działa również dla mnie. Chociaż tak naprawdę chciałbym to zrobić, byłoby coś takiego: p = punkty [0] [0] p ['a'] = np.array ([1, 1, 1]) I inne manipulacje na p, jeśli to konieczne. –

+0

@Tim: AFAIK, wydaje się naturalne, aby najpierw określić nazwaną kolumnę, a dopiero potem przejść do indeksów numerycznych. W ten sposób umiejętność pisania punktów ['a'] [0] lub punktów [0] ['a'] (które działa dla tablic DTS-ów) wydaje się dla mnie darmowym lunchem. –

Powiązane problemy