2014-10-21 22 views
9

Kann mir jemand erklären, warum Versuch Nr. 1 nicht funktioniert?Werte einem NumPy-Array zuweisen

import numpy as np  
x = np.zeros(1, dtype=np.dtype([('field', '<f8', (1,2))])) 

Versuch # 1:

x[0]['field'] = np.array([3.,4.], dtype=np.double) 
print x, '\n' 

[([[ 3. 0.]])] (warum nur wurde die '3' kopiert?)

Versuch # 2:

x['field'][0] = np.array([3.,4.], dtype=np.double) 
print x 

[([[ 3. 4.]])] (dies funktioniert)

+1

Dies scheint ein Problem mit '__setitem __()' zu sein, weil 'x [0:] ['field'] = ...' funktioniert! Sogar 'x [0: 999999] ['field'] = ...', mit sehr hohen Indizes, die einfach ignoriert werden ... –

Antwort

2

Um ehrlich zu sein ... Ich bin nicht sicher, ich bin entweder die Ergebnisse zu bekommen. Es scheint inkonsistent/gebrochen. Ein Teil davon ist auf inkonsistente Formen zurückzuführen, aber nicht auf alles. Einige Daten scheinen zu verschwinden.

Zum Beispiel (die Formen beachten):

In [1]: import numpy as np 

In [2]: x = np.zeros(1, dtype=np.dtype([('field', '<f8', (1, 2))])) 

In [3]: y = x[0]['field'].copy() 

In [4]: y[0] = 3 

In [5]: y[1] = 4 
--------------------------------------------------------------------------- 
IndexError        Traceback (most recent call last) 
<ipython-input-5-cba72439f97c> in <module>() 
----> 1 y[1] = 4 

IndexError: index 1 is out of bounds for axis 0 with size 1 

In [6]: y[0][1] = 4 

In [7]: x 
Out[7]: 
array([([[0.0, 0.0]],)], 
     dtype=[('field', '<f8', (1, 2))]) 

In [8]: y 
Out[8]: array([[ 3., 4.]]) 

In [9]: x[0]['field'] = y 

In [10]: x 
Out[10]: 
array([([[3.0, 0.0]],)], 
     dtype=[('field', '<f8', (1, 2))]) 

So ..., um es einfacher zu erreichen, lassen Sie sich die Form einfacher.

In [1]: import numpy as np 

In [2]: x = np.zeros(1, dtype=np.dtype([('field', '<f8', 2)])) 

In [3]: y = x[0]['field'].copy() 

In [4]: y[0] = 3 

In [5]: y[1] = 4 

In [6]: x[0]['field'] = y 

In [7]: x 
Out[7]: 
array([([3.0, 0.0],)], 
     dtype=[('field', '<f8', (2,))]) 

In [8]: y 
Out[8]: array([ 3., 4.]) 

Wohin die Daten in diesem Fall gehen ... kein Hinweis. Zuordnen, dass die Daten gespeichert werden, scheint jedoch problemlos möglich zu sein.

Mehrere Optionen:

In [9]: x['field'][0] = y 

In [10]: x 
Out[10]: 
array([([3.0, 4.0],)], 
     dtype=[('field', '<f8', (2,))]) 

In [11]: x['field'] = y * 2 

In [12]: x 
Out[12]: 
array([([6.0, 8.0],)], 
     dtype=[('field', '<f8', (2,))]) 

In [13]: x['field'][:] = y 

In [14]: x 
Out[14]: 
array([([3.0, 4.0],)], 
     dtype=[('field', '<f8', (2,))]) 

In [15]: x[0]['field'][:] = y * 2 

In [16]: x 
Out[16]: 
array([([6.0, 8.0],)], 
     dtype=[('field', '<f8', (2,))]) 
2

Es scheint eine anerkannte bug in Numpy zu sein. Dort wird über mögliche Korrekturen diskutiert, aber der Fehler ist noch offen.

Verwandte Themen