python:numpy:命名数组的串联

python:numpy:命名数组的串联,python,numpy,Python,Numpy,考虑以下简单示例: x = numpy.array([(1,2),(3,4)],dtype=[('a','<f4'),('b','<f4')]) y = numpy.array([(1,2),(3,4)],dtype=[('c','<f4'),('d','<f4')]) numpy.hstack((x,y)) x=numpy.array([(1,2),(3,4)],dtype=[('a','问题在于类型不同。“title”是类型的一部分,y使用了与x不同的名称,因此类型

考虑以下简单示例:

x = numpy.array([(1,2),(3,4)],dtype=[('a','<f4'),('b','<f4')])
y = numpy.array([(1,2),(3,4)],dtype=[('c','<f4'),('d','<f4')])
numpy.hstack((x,y))

x=numpy.array([(1,2),(3,4)],dtype=[('a','问题在于类型不同。“title”是类型的一部分,
y
使用了与
x
不同的名称,因此类型不兼容。如果使用兼容的类型,一切正常:

>>> x = numpy.array([(1, 2), (3, 4)], dtype=[('a', '<f4'), ('b', '<f4')])
>>> y = numpy.array([(5, 6), (7, 8)], dtype=[('a', '<f4'), ('b', '<f4')])
>>> numpy.vstack((x, y))
array([[(1.0, 2.0), (3.0, 4.0)],
       [(5.0, 6.0), (7.0, 8.0)]], 
      dtype=[('a', '<f4'), ('b', '<f4')])
>>> numpy.hstack((x, y))
array([(1.0, 2.0), (3.0, 4.0), (5.0, 6.0), (7.0, 8.0)], 
      dtype=[('a', '<f4'), ('b', '<f4')])
>>> numpy.dstack((x, y))
array([[[(1.0, 2.0), (5.0, 6.0)],
        [(3.0, 4.0), (7.0, 8.0)]]], 
      dtype=[('a', '<f4'), ('b', '<f4')])
这就是允许记录数组包含异构数据的原因;记录数组可以同时包含字符串和整数,但折衷的办法是,在单个记录的级别上,您无法获得
ndarray
的全部功能

结果是,要连接单个内存块,实际上必须修改数组的
dtype
。有几种方法可以做到这一点,但我能找到的最简单的方法是鲜为人知的
numpy.lib.recfunctions
库(我看到您已经找到了!):

>>numpy.lib.recfunctions.rec\u append\u字段(x,
y、 dtype.names,
[y[n]表示y.dtype.names中的n])
记录数组([(1.0,2.0,1.0,2.0),(3.0,4.0,3.0,4.0)],

数据类型=[('a','但这不是我想要的…我希望新数组具有从联接继承的标题…例如,在hstack之后,我希望具有标题:'a','b','c','d'。为什么python关心名称而不仅仅是类型?!让我发疯了。我认为我需要使用Pandas而不是直接使用numpy。@Hanansteingart,你使用的ap不正确。@然后,您必须创建一个全新的数据类型。似乎您错误地认为
x
y
是二维数组。它们不是。请参见我上面的编辑。
x = numpy.array([(1,2),(3,4)],dtype='<f4')
y = numpy.array([(1,2),(3,4)],dtype='<f4')
numpy.hstack((x,y))
>>> x = numpy.array([(1, 2), (3, 4)], dtype=[('a', '<f4'), ('b', '<f4')])
>>> y = numpy.array([(5, 6), (7, 8)], dtype=[('a', '<f4'), ('b', '<f4')])
>>> numpy.vstack((x, y))
array([[(1.0, 2.0), (3.0, 4.0)],
       [(5.0, 6.0), (7.0, 8.0)]], 
      dtype=[('a', '<f4'), ('b', '<f4')])
>>> numpy.hstack((x, y))
array([(1.0, 2.0), (3.0, 4.0), (5.0, 6.0), (7.0, 8.0)], 
      dtype=[('a', '<f4'), ('b', '<f4')])
>>> numpy.dstack((x, y))
array([[[(1.0, 2.0), (5.0, 6.0)],
        [(3.0, 4.0), (7.0, 8.0)]]], 
      dtype=[('a', '<f4'), ('b', '<f4')])
>>> x = numpy.array([(1, 2), (3, 4)], dtype=[('a', '<f4'), ('b', '<f4')])
>>> x[0]
(1.0, 2.0)
>>> type(x[0])
<type 'numpy.void'>

>>> z = numpy.array([(1, 2), (3, 4)])
>>> z[0]
array([1, 2])
>>> type(z[0])
<type 'numpy.ndarray'>
>>> numpy.lib.recfunctions.rec_append_fields(x, 
                                             y.dtype.names, 
                                             [y[n] for n in y.dtype.names])
rec.array([(1.0, 2.0, 1.0, 2.0), (3.0, 4.0, 3.0, 4.0)], 
      dtype=[('a', '<f4'), ('b', '<f4'), ('c', '<f4'), ('d', '<f4')])