首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Numpy:连接结构化数组?

Numpy:连接结构化数组?
EN

Stack Overflow用户
提问于 2011-03-19 01:33:55
回答 3查看 14.2K关注 0票数 27

输入

在类似下面的示例列表中,我有很多numpy structured arrays

代码语言:javascript
复制
import numpy

a1 = numpy.array([(1, 2), (3, 4), (5, 6)], dtype=[('x', int), ('y', int)])

a2 = numpy.array([(7,10), (8,11), (9,12)], dtype=[('z', int), ('w', float)])

arrays = [a1, a2]

期望输出

将它们连接在一起以创建如下所示的统一结构化数组的正确方法是什么?

代码语言:javascript
复制
desired_result = numpy.array([(1, 2, 7, 10), (3, 4, 8, 11), (5, 6, 9, 12)],
                             dtype=[('x', int), ('y', int), ('z', int), ('w', float)])

当前方法

这就是我目前正在使用的,但它非常慢,所以我怀疑一定有更有效的方法。

代码语言:javascript
复制
from numpy.lib.recfunctions import append_fields

def join_struct_arrays(arrays):
    for array in arrays:
        try:
            result = append_fields(result, array.dtype.names, [array[name] for name in array.dtype.names], usemask=False)
        except NameError:
            result = array

    return result
EN

回答 3

Stack Overflow用户

发布于 2011-03-19 02:13:41

您还可以使用numpy.lib.recfunctions的函数merge_arrays

代码语言:javascript
复制
import numpy.lib.recfunctions as rfn
rfn.merge_arrays(arrays, flatten = True, usemask = False)

Out[52]: 
array([(1, 2, 7, 10.0), (3, 4, 8, 11.0), (5, 6, 9, 12.0)], 
     dtype=[('x', '<i4'), ('y', '<i4'), ('z', '<i4'), ('w', '<f8')])
票数 45
EN

Stack Overflow用户

发布于 2011-03-19 03:03:24

还有另一种方式,可读性更好,速度也更快,我认为:

代码语言:javascript
复制
def join_struct_arrays(arrays):
    newdtype = []
    for a in arrays:
        descr = []
        for field in a.dtype.names:
            (typ, _) = a.dtype.fields[field]
            descr.append((field, typ))
        newdtype.extend(tuple(descr))
    newrecarray = np.zeros(len(arrays[0]), dtype = newdtype)
    for a in arrays:
        for name in a.dtype.names:
            newrecarray[name] = a[name]
    return newrecarray

编辑:在Sven的建议下,它变得(有点慢,但实际上可读性很好):

代码语言:javascript
复制
def join_struct_arrays2(arrays):
    newdtype = sum((a.dtype.descr for a in arrays), [])
    newrecarray = np.empty(len(arrays[0]), dtype = newdtype)
    for a in arrays:
        for name in a.dtype.names:
            newrecarray[name] = a[name]
    return newrecarray
票数 8
EN

Stack Overflow用户

发布于 2021-06-19 20:20:58

代码语言:javascript
复制
def join_struct_arrays(*arrs):
    dtype = [(name, d[0]) for arr in arrs for name, d in arr.dtype.fields.items()]
    r = np.empty(arrs[0].shape, dtype=dtype)
    for a in arrs:
       for name in a.dtype.names:
           r[name] = a[name]
    return r
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5355744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档