[この投稿の以前のバージョンには、「numpyレコードの配列に1つの列を追加する方法」という不正確なタイトルがありました。その以前のタイトルで尋ねられた質問はすでに部分的に回答されていますが、この回答は、この投稿の以前のバージョンの本文が求めていたものではありません。区別を明確にするために、タイトルを書き直し、投稿を大幅に編集しました。また、前述の答えが私が探しているものに達していない理由についても説明します。]
2つのnumpy
配列x
とがありy
、それぞれがr個の「レコード」(別名「構造化」)配列で構成されているとします。x
be(r、c x)の形とy
be(r、c y )の形を考えてみましょう。x.dtype.names
また、との間に重複がないと仮定しましょうy.dtype.names
。
たとえば、r = 2、c x = 2、およびc y = 1の場合:
import numpy as np
x = np.array(zip((1, 2), (3., 4.)), dtype=[('i', 'i4'), ('f', 'f4')])
y = np.array(zip(('a', 'b')), dtype=[('s', 'a10')])
x
「水平方向に」連結して、形状(r、c x + c y )を持つレコードの新しいy
配列を生成したいと思います。この操作は変更しないでください。z
x
y
とは必ずしも一致しないz = np.hstack((x, y))
ため、通常は実行しません。たとえば、上記の例を続けます。dtype
x
y
z = np.hstack((x, y))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-7-def477e6c8bf> in <module>()
----> 1 z = np.hstack((x, y))
TypeError: invalid type promotion
今、私が探しているものに近い何かをするかもしれないように見える関数がありますが、私はそれから何も得ることができませんでした:私がそれで試したすべてはエラーで失敗するnumpy.lib.recfunctions.append_fields
か、私が取得しようとしているもの以外のものを生成します。
誰かが、上記の例で定義された、から、およびの水平連結に相当するレコードの新しい配列を生成するコード(または1を使用)を明示的に示して、またはを変更せずにそれを行うことができますか?n.l.r.append_fields
x
y
z
x
y
x
y
これには1行か2行のコードしか必要ないと思います。もちろん、ビルドz
、レコードごと、反復処理を必要x
としないコードを探していますy
。また、コードは、とが同じ数のレコードを持ち、との間に重複がないと想定する場合x
がy
ありx.dtype.names
ますy.dtype.names
。これ以外に、私が探しているコードはとについて何も知らないはずx
ですy
。理想的には、結合するアレイの数についても不可知論的である必要があります。IOW、エラーチェックを除いて、私が探しているコードはhstack_rec
、新しい配列z
が結果になるように関数の本体である可能性がありhstack_rec((x, y))
ます。
1 ...確かに、これまでの完璧な失敗の記録の後、この投稿の質問との関連性に関係なく、この関数をnumpy.lib.recfunctions.append_fields
どのように使用できるかについて少し興味がありました。