簡體   English   中英

將numpy recarray復制到ndarray

[英]copy numpy recarray to ndarray

我有一個過程需要將數據從numpy recarray提取到ndarray,然后再執行一些矢量數學運算。 (recarray來自pytables table.read()函數。)我想將數學輸出(另一個ndarray)映射回原始Recarray中的相同字段/列。 我找到了一種逐列進行的方法。 尋找一種更好的方式來回處理數據。 我的代碼:

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]

我試圖這樣做以跳過第一個recarray到ndarray:

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

numpy抱怨:

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

另外,正在尋找可以簡化ndarray數據回到recarray的方法。 謝謝。

這是未來的警告,不是錯誤。 更改已推遲到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將不起作用。 關於補償有一些復雜的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM