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

2024-09-25 08:39:39 发布

您现在位置:Python中文网/ 问答频道 /正文

如何将具有命名字段且长度相同的两个numpy ndarray正确地组合成一个ndarray?在下面的示例中,我希望将xnd和{}合并为一个numpy ndarray。在

我知道如何从xndynd的连接数据类型创建一个新的ndarray,然后迭代地将xnd和{}的内容复制到新的ndarray中。但是有没有一个新的命令可以帮我做到这一点?在

组合xnd和{}的最快和最简单的方法是理想的。也许在ynd后面加上xnd而不是复制?此解决方案需要快速处理大型ndarray。在

我看到了几个关于如何组合简单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')]

Tags: numpycreatenp例子abcprintndarrayjoin
1条回答
网友
1楼 · 发布于 2024-09-25 08:39:39

以下是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')])

由于通常记录的数量远远大于字段的数量,所以这种迭代并不昂贵。在

可能有一个函数可以从单个函数中创建联合zdt,但我现在不打算深入研究。在

有一个函数可以递归地复制字段。如果dtype是具有复合数据类型的嵌套字段,则需要这样做。在

您还可以从元组列表创建一个新数组—每个记录一个元组。在这里,我使用zip()对这两个数组进行迭代,并用元组连接来连接它们的记录。在

^{pr2}$

我希望这会慢一些,至少当行数多于字段数时。在


由于在本例中字段中没有重叠,所以只需合并这些数据类型的dtye.descr,就可以生成新的数据类型。descr是一个列表;一个列表可以连接到另一个列表。在

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

相关问题 更多 >