2014-10-21 28 views
9

पर असाइन करना क्या कोई मुझे समझा सकता है कि प्रयास # 1 क्यों काम नहीं करता है?मूल्यों को एक NumPy सरणी

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

प्रयास # 1:

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

[([[ 3. 0.]])] (क्यों केवल '3' पर कॉपी किया गया था?)

प्रयास # 2:

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

[([[ 3. 4.]])] (यह काम किया)

+1

यह '__setitem __()' के साथ एक मुद्दा प्रतीत होता है, क्योंकि 'x [0:] ['field'] = ... 'काम करता है! यहां तक ​​कि 'x [0: 99 99 99] ['field'] = ... ', बहुत उच्च सूचकांक का उपयोग करके, जिन्हें आसानी से अनदेखा कर दिया जाता है ... –

उत्तर

2

ईमानदारी से कहूं तो ... मुझे यकीन है कि मैं या तो परिणाम मिल रहे हैं नहीं कर रहा हूँ। यह असंगत/टूटा लगता है। इसका हिस्सा असंगत आकार के कारण है, लेकिन यह सब नहीं। कुछ डेटा गायब होने लगते हैं।

उदाहरण के लिए

(आकार पर ध्यान दें):

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

तो ... यह आसान समझ बनाने के लिए, चलो आकार को आसान बनाने के।

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.]) 

जहां इस मामले में डेटा जा रहा है ... कोई सुराग नहीं है। इस तरह से असाइन करना कि डेटा संग्रहीत किया जाता है, हालांकि आसानी से संभव लगता है।

कई विकल्प:

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

यह Numpy में एक मान्यता प्राप्त bug प्रतीत होता है। संभावित सुधारों पर चर्चा है, लेकिन बग अभी भी खुला है।

संबंधित मुद्दे