Python 将numpy recarray复制到ndarray

Python 将numpy recarray复制到ndarray,python,numpy,Python,Numpy,我有一个过程,需要将数据从一个numpy重数组提取到一个ndarray,然后在那里做一些向量数学。(recarray来自pytables table.read()函数。)我想将数学输出(另一个ndarray)映射回原始recarray中的相同字段/列。我找到了一种方法,一列一列地做。寻找一种更好的方法来处理数据。我的代码: node_eigen_array = eigenvb_table.read_coordinates(node_rows) node_eigen_array.shape[0]

我有一个过程,需要将数据从一个numpy重数组提取到一个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]
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数据简化为重新排列的东西。
谢谢。

这是未来的警告,不是错误。更改已推迟到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')])
消除警告的一种方法是在索引后添加
copy()

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

当前,此
视图
更改有效。但是在计划的更改中,
arr[['X','Y','Z']]
数据布局将不同,并且
视图将不起作用。补偿有一些复杂的问题。

谢谢。是的,最初我有.copy()…我想我今天早上忽略了这一点。那么,有没有将值从ndarray c_点复制回匹配的arr[['ID'、'X'、'Y'、'Z'、'FREQ']]布局的技巧呢?我不担心在任何方向进行逐字段复制。您有3个字段,有多少条记录-1000条?逐字段复制是
recfunctions
中的标准过程。我可以轻松地拥有10e3到100e3甚至1e6记录,但性能不是我首先关心的问题。我一直在寻找代码的简单性,因为我必须用其他条目来实现这一点。也就是说,我有一个工作程序,听起来很好。我只需要每次都小心使用索引。谢谢你的见解!!最新的recfunctions与非结构化函数之间具有结构化关系。见1.16文件
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.])
In [62]: arr[['X','Y','Z']].copy().view('float64')
Out[62]: array([1., 1., 1., 1., 1., 1., 1., 1., 1.])