python – 堆叠numpy recarrays而不会丢失它们的重新组合

假设我使用相同的dtype制作两个重组并堆叠它们:

>>> import numpy as np
>>> dt = [('foo', int), ('bar', float)]
>>> a = np.empty(2, dtype=dt).view(np.recarray)
>>> b = np.empty(3, dtype=dt).view(np.recarray)
>>> c = np.hstack((a,b))

虽然a和b是重组,但c不是:

>>> c.foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'numpy.ndarray' object has no attribute 'foo'
>>> d = c.view(np.recarray)
>>> d.foo
array([                  0,     111050731618561,                   0,
                   7718048, 8246760947200437872])

我显然可以再次将它变成一个重新组合,如上面的d所示,但这很不方便.有没有理由为什么堆叠两个重组不会产生另一个重新排列?

最佳答案
我不知道.很可能它是一个从未实现过的bug /功能. numpy.hstack基本上是numpy.core.fromnumeric中函数的包装器.数字是numpy的两个前身之一. numpy中的大多数函数都有一个约定,通过调用输出上输入的方法__array_wrap__来输出与输入相同的类型,结果输出应该具有相同的数据,但在新类中“包装”.也许“包装”的概念不是数字的,也没有添加到这个功能.

您可以使用此技术来实现更智能的堆叠功能

def hstack2(arrays) :
  return arrays[0].__array_wrap__(numpy.hstack(arrays))

这适用于重组和常规数组

>>> f = hstack2((a,b))
>>> type(f)
<class 'numpy.core.records.recarray'>
>>> f.foo
array([    140633760262784,     111050731618561,     140633760262800,
                   7536928, 8391166428122670177])
>>> x = numpy.random.rand(3)
>>> y = numpy.random.rand(2)
>>> z = hstack2((x,y))
>>> type(z)
<type 'numpy.ndarray'>

我不确定你的计划是什么,但你可能想问一下numpy mailing list是否有比使用记录的,但双重强调的方法更好的方法,以及他们的理由是不做自己的包装.

转载注明原文:python – 堆叠numpy recarrays而不会丢失它们的重新组合 - 代码日志