Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用命名字段组合两个numpy-ndarray数组_Python_Arrays_Numpy_Multidimensional Array - Fatal编程技术网

Python 使用命名字段组合两个numpy-ndarray数组

Python 使用命名字段组合两个numpy-ndarray数组,python,arrays,numpy,multidimensional-array,Python,Arrays,Numpy,Multidimensional Array,如何正确地将两个具有命名字段且长度相同的numpy ndarray组合成一个ndarray?在下面的示例中,我想将xnd和ynd组合成一个numpy数组 我知道如何从连接的数据类型xnd和ynd创建一个新的数据数组,然后迭代地将xnd和ynd中的内容复制到新的数据数组中。但是有一个numpy命令可以帮我做这件事吗 将xnd和ynd结合起来的最快最简单的方法是理想的。也许是将ynd附加到xnd中而不是复制?此解决方案需要在大型阵列中快速工作 我已经看到了几个关于如何组合简单的n维numpy数组的示

如何正确地将两个具有命名字段且长度相同的numpy ndarray组合成一个ndarray?在下面的示例中,我想将
xnd
ynd
组合成一个numpy数组

我知道如何从连接的数据类型
xnd
ynd
创建一个新的数据数组,然后迭代地将
xnd
ynd
中的内容复制到新的数据数组中。但是有一个numpy命令可以帮我做这件事吗

xnd
ynd
结合起来的最快最简单的方法是理想的。也许是将
ynd
附加到
xnd
中而不是复制?此解决方案需要在大型阵列中快速工作

我已经看到了几个关于如何组合简单的n维numpy数组的示例,但它们并没有帮助我解决这个问题。示例底部带有
znd=np.join((xnd,ynd))
的那一行就是我被卡住的地方

谢谢

import numpy as np

n = 10

t = np.arange(n)
abc = np.array((t,t+n,t+2*n)).T
y = (t*10).astype(np.uint32) 


# Create x ndarray
xdt = np.dtype([
    ('t', np.float64),
    ('abc', (np.float32, 3) )
    ])
xnd = np.ndarray( shape=n, dtype=xdt)
xnd['t'] = t
xnd['abc'] = abc

# Create y ndarray
ydt = np.dtype([
    ('y', np.uint32),
    ])
ynd = np.ndarray( shape=n, dtype=ydt)
ynd['y'] = y


print xnd.dtype
# [('t', '<f8'), ('abc', '<f4', (3,))]
print ynd.dtype
# [('y', '<u4')]


# Combine x and y
# This line not correct.  What is the proper way to do this?
znd = np.join((xnd, ynd)) 

print znd.dtype
# [('t', '<f8'), ('abc', '<f4', (3,)), ('y', '<u4')]
将numpy导入为np
n=10
t=np.arange(n)
abc=np.数组((t,t+n,t+2*n)).t
y=(t*10).aType(np.uint32)
#创建x阵列
xdt=np.dtype([
('t',np.64),
(‘abc’,(np.32,3))
])
xnd=np.ndarray(shape=n,dtype=xdt)
xnd['t']=t
xnd['abc']=abc
#创建y形阵列
ydt=np.dtype([
('y',np.uint32),
])
ynd=np.ndarray(shape=n,dtype=ydt)
ynd['y']=y
打印xnd.dtype

#[('t','以下是
recarray
函数的功能-按名称复制字段:

In [10]: zdt=[('t', '<f8'), ('abc', '<f4', (3,)), ('y', '<u4')]
In [11]: znd=np.zeros(xnd.shape, dtype=zdt)

In [12]: for name in xnd.dtype.names:
   ....:     znd[name]=xnd[name]
   ....:     

In [13]: for name in ynd.dtype.names:
    znd[name]=ynd[name]
   ....:     

In [14]: znd
Out[14]: 
array([(0.0, [0.0, 10.0, 20.0], 0L), (1.0, [1.0, 11.0, 21.0], 10L),
       (2.0, [2.0, 12.0, 22.0], 20L), (3.0, [3.0, 13.0, 23.0], 30L),
       (4.0, [4.0, 14.0, 24.0], 40L), (5.0, [5.0, 15.0, 25.0], 50L),
       (6.0, [6.0, 16.0, 26.0], 60L), (7.0, [7.0, 17.0, 27.0], 70L),
       (8.0, [8.0, 18.0, 28.0], 80L), (9.0, [9.0, 19.0, 29.0], 90L)], 
      dtype=[('t', '<f8'), ('abc', '<f4', (3,)), ('y', '<u4')])
我预计这会更慢,至少当行数多于字段数时


由于在这种情况下字段没有重叠,因此只需将数据类型的
dtye.descr
合并即可创建新的数据类型。
descr
是一个列表;一个列表可以连接到另一个列表

In [26]: np.dtype(xnd.dtype.descr+ynd.dtype.descr)
Out[26]: dtype([('t', '<f8'), ('abc', '<f4', (3,)), ('y', '<u4')])
[26]中的
:np.dtype(xnd.dtype.descr+ynd.dtype.descr)

Out[26]:dtype([('t','我的问题是重复的,已经在这里回答了:
In [26]: np.dtype(xnd.dtype.descr+ynd.dtype.descr)
Out[26]: dtype([('t', '<f8'), ('abc', '<f4', (3,)), ('y', '<u4')])