8

同じ dtype で 2 つの再配列を作成し、それらをスタックするとします。

>>> 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が、これは不便です。2 つの再配列をスタックしても別の再配列が生成されない理由はありますか?

4

3 に答える 3

10

あるいは、ここでnumpy.lib.recfunctions見つけたヘルパー ユーティリティがいくつかあります。このモジュールには、マージとスタックの両方の機能があります。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

(質問への回答ではありませんが、後者の例を参考に掲載しています)

于 2013-01-30T20:38:38.417 に答える
9

知らない。ほとんどの場合、実装されていないバグ/機能です。 numpy.hstackは基本的に の関数のラッパーnumpy.core.fromnumericです。Numeric は、numpy の 2 つの前身の 1 つです。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 メーリング リストで、文書化されているが下線が 2 つ付いている方法を使用するよりも良い方法があるかどうか、またラッピングを自分で行わない理由は何なのかを尋ねてください。

于 2009-11-24T22:12:20.187 に答える
-2

ちなみに、次のものも使用できます。

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

また

c = np.r_[a, b]

(ソース:このメーリング リスト メッセージ)

于 2010-07-23T23:25:46.800 に答える