मेरे पास एक प्रक्रिया है जिसके लिए एक numpy recarray से डेटा निकालने की आवश्यकता होती है जहां मैं कुछ वेक्टर गणित करता हूं। (पुनरावर्ती एक pytables तालिका से आता है। पढ़ें () फ़ंक्शन।) मैं गणित आउटपुट (एक और ndarray) को मूल पुनरावर्तन में उसी फ़ील्ड/कॉलम पर वापस मैप करना चाहता हूं। मुझे कॉलम द्वारा कॉलम करने का एक तरीका मिला। डेटा के साथ आगे और पीछे जाने का बेहतर तरीका खोज रहे हैं। मेरा कोड:

node_eigen_array = eigenvb_table.read_coordinates(node_rows)
node_eigen_array.shape[0]
10
node_eigen_array.dtype
dtype([('ID', '<i8'), ('X', '<f8'), ('Y', '<f8'), ('Z', '<f8'),  ('FREQ', '<i8')])
resvec_array[:,0]=node_eigen_array['X']
resvec_array[:,1]=node_eigen_array['Y']
resvec_array[:,2]=node_eigen_array['Z']

# do some stuff that returns ndarray c_dot...

node_eigen_array['X']=cdot[:,0]
node_eigen_array['Y']=cdot[:,1]
node_eigen_array['Z']=cdot[:,2]

मैंने पहली पुनरावृत्ति को ndarray पर छोड़ने की कोशिश की:

resvec_array=node_eigen_array[['X','Y','Z']].view('float64').reshape((10,3))

सुन्न शिकायत:

This code may break in numpy 1.13 because this will return a view instead of a copy -- see release notes for details.

साथ ही, ऐसी किसी चीज़ की तलाश करना जो ndarray डेटा को पुन: व्यवस्थित करने के लिए सरल बनाती है। धन्यवाद।

0
kcw78 5 अक्टूबर 2018, 22:27

1 उत्तर

सबसे बढ़िया उत्तर

यह भविष्य की चेतावनी है, त्रुटि नहीं। परिवर्तन 1.16 तक स्थगित कर दिया गया है। इसे मल्टीफ़ील्ड इंडेक्सिंग, आपके [['X','Y','Z']] चरण के साथ करना है।

In [56]: dt = np.dtype([('ID', '<i8'), ('X', '<f8'), ('Y', '<f8'), ('Z', '<f8'), ('FREQ', '<i8')])
In [57]: arr = np.ones(3, dtype=dt)
In [58]: arr       # a structured array, recarray is just variation
Out[58]: 
array([(1, 1., 1., 1., 1), (1, 1., 1., 1., 1), (1, 1., 1., 1., 1)],
      dtype=[('ID', '<i8'), ('X', '<f8'), ('Y', '<f8'), ('Z', '<f8'), ('FREQ', '<i8')])

जब आप केवल फ़ील्ड देखते हैं तो यह शांत होता है:

In [59]: arr[['X','Y','Z']]
Out[59]: 
array([(1., 1., 1.), (1., 1., 1.), (1., 1., 1.)],
      dtype=[('X', '<f8'), ('Y', '<f8'), ('Z', '<f8')])

लेकिन जब आप उनके साथ कुछ करने की कोशिश करते हैं तो यह बदलाव की चेतावनी देता है। ध्यान दें कि यह अभी भी कार्रवाई करता है।

In [60]: arr[['X','Y','Z']].view('float64')
/usr/local/bin/ipython3:1: FutureWarning: Numpy has detected that you may be viewing or writing to an array returned by selecting multiple fields in a structured array. 

This code may break in numpy 1.16 because this will return a view instead of a copy -- see release notes for details.
  #!/usr/bin/python3
Out[60]: array([1., 1., 1., 1., 1., 1., 1., 1., 1.])

अनुक्रमणिका के बाद copy() जोड़ना चेतावनी को शांत करने का एक तरीका है:

In [62]: arr[['X','Y','Z']].copy().view('float64')
Out[62]: array([1., 1., 1., 1., 1., 1., 1., 1., 1.])

वर्तमान में यह view परिवर्तन कार्य करता है। लेकिन नियोजित परिवर्तन में, arr[['X','Y','Z']] डेटा लेआउट भिन्न होगा, और view काम नहीं करेगा। ऑफ़सेट के बारे में कुछ जटिल व्यवसाय है।

1
hpaulj 5 अक्टूबर 2018, 19:53