5

[この投稿の以前のバージョンには、「numpyレコードの配列に1つの列を追加する方法」という不正確なタイトルがありました。その以前のタイトルで尋ねられた質問はすでに部分的に回答されていますが、この回答は、この投稿の以前のバージョンの本文が求めていたものではありません。区別を明確にするために、タイトルを書き直し、投稿を大幅に編集しました。また、前述の答えが私が探しているものに達していない理由についても説明します。]


2つのnumpy配列xとがありy、それぞれがr個の「レコード」(別名「構造化」)配列で構成されているとします。xbe(rc x)の形とybe(rc 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「水平方向に」連結して、形状(rc x + c y )を持つレコードの新しいy配列を生成したいと思います。この操作は変更しないでください。zxy

とは必ずしも一致しないz = np.hstack((x, y))ため、通常は実行しません。たとえば、上記の例を続けます。dtypexy

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_fieldsxyzxyxy

これには1行か2行のコードしか必要ないと思います。もちろん、ビルドz、レコードごと、反復処理を必要xとしないコードを探していますy。また、コードは、とが同じ数のレコードを持ち、との間に重複がないと想定する場合xyありx.dtype.namesますy.dtype.names。これ以外に、私が探しているコードはとについて何も知らないはずxですy。理想的には、結合するアレイの数についても不可知論的である必要があります。IOW、エラーチェックを除いて、私が探しているコードはhstack_rec、新しい配列zが結果になるように関数の本体である可能性がありhstack_rec((x, y))ます。


1 ...確かに、これまでの完璧な失敗の記録の後、この投稿の質問との関連性に関係なく、この関数numpy.lib.recfunctions.append_fieldsどのように使用できるかについて少し興味がありました。

4

2 に答える 2

5

私は決して rearrays を使用しないので、他の誰かがより洗練されたものを思いつくでしょうが、うまくいくでしょmerge_arraysうか?

>>> import numpy.lib.recfunctions as nlr
>>> x = np.array(zip((1, 2), (3., 4.)), dtype=[('i', 'i4'), ('f', 'f4')])
>>> y = np.array(zip(('a', 'b')), dtype=[('s', 'a10')])
>>> x
array([(1, 3.0), (2, 4.0)], 
      dtype=[('i', '<i4'), ('f', '<f4')])
>>> y
array([('a',), ('b',)], 
      dtype=[('s', '|S10')])
>>> z = nlr.merge_arrays([x, y], flatten=True)
>>> z
array([(1, 3.0, 'a'), (2, 4.0, 'b')], 
      dtype=[('i', '<i4'), ('f', '<f4'), ('s', '|S10')])
于 2013-02-18T20:14:43.980 に答える