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')])