python 堆叠numpy重新阵列而不丢失其重新阵列性

vnzz0bqm  于 2023-06-28  发布在  Python
关注(0)|答案(3)|浏览(157)

假设我用相同的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))

虽然ab是重新阵列,但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所示,但这很不方便。为什么叠加两个重组不会产生另一个重组?

hi3rlvi2

hi3rlvi21#

另外,在numpy.lib.recfunctions中有一些辅助工具,我偶然发现了here。此模块具有合并和堆叠recarrays的功能:

from numpy.lib.recfunctions import stack_arrays
c = stack_arrays((a, b), asrecarray=True, usemask=False)
c.foo
>>> array([     140239282560000,           4376479720, -4611686018427387904,
                     4358733828,           4365061216])

如果想要在recarray中添加额外的列,可以使用merge_arrays来完成:

import numpy as np
from numpy.lib.recfunctions import merge_arrays
dt1 = [('foo', int), ('bar', float)]
dt2 = [('foobar', int), ('barfoo', float)]
aa = np.empty(6, dtype=dt1).view(np.recarray)
bb = np.empty(6, dtype=dt2).view(np.recarray)

cc = merge_arrays((aa, bb), asrecarray=True, flatten=True)
type(cc)
>>> numpy.core.records.recarray

(虽然不是对这个问题的回答,但我发布了后一个示例作为参考)

dwbf0jvd

dwbf0jvd2#

我不知道。很可能是一个从未实现过的bug/功能。numpy.hstack基本上是numpy.core.fromnumeric中函数的 Package 器。Numeric是numpy的两个前身之一。numpy中的大多数函数都有一个约定,即通过在输出上调用输入的方法__array_wrap__来输出与输入相同的类型,结果输出应该具有相同的数据,但“ Package ”在新类中。也许“ Package ”的概念并不是数字的,也从未被添加到这个函数中。
您可以使用此技术来制作更智能的堆叠功能

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上是否有比使用文档中的,但双下划线的方法更好的方法,以及他们不自己 Package 的理由是什么。

rm5edbpk

rm5edbpk3#

顺便说一句,你也可以用途:

c = np.concatenate((a,b))

c = np.r_[a, b]

(图片来源:this mailing list message

相关问题