0

-として定義された配列があります

import numpy as np
A = np.recarray((3,),dtype=[('x',float), ('y', float), ('z',float)])

さらに、CSVファイルから-として読み取られる別の配列B

>>> print B
[(7.0, 0.0, 7.0) (16.0, 0.0, 1.0)]

以下のように配列に要素を追加しようとすると-

for i in range(B.size):
    if(B[i][0] != 0.):
        A.append((0.,B[i][1],B[i][2]))
    if(B[i][1] != 0.):
        A.append((B[i][0],0.,B[i][2]))
    if(B[i][2] != 0.):
        A.append((B[i][0],B[i][1],0.))

次のようなエラーが発生します-

File "/usr/lib/python2.7/dist-packages/numpy/core/records.py", line 416, in __getattribute__
    raise AttributeError, "record array has no attribute %s" % attr
    AttributeError: record array has no attribute append

この文字列属性(%s)がどこに現れるのか理解できませんか?

誰か助けてもらえますか?

更新: コードをに変更しましたがnp.append(A,(0.,B[i][1],B[i][2]))、次のような別のエラーが発生します-TypeError: invalid type promotion

4

2 に答える 2

1

エラーは、recarrayにappendというメソッドがないことを示しているだけです。

私は実際にはnumpyを使用していませんが、1つの解決策はAをリストに変換することです。

A.tolist()

このリストにレコードを追加してから、次のようなことを行います

np.fromiter(x, A.dtype)

新しい再配列を取得します。もちろん、これは良い解決策のようには見えません。

おそらく、numpyに精通している人なら、それを売り込んで改善できるでしょう。

于 2012-10-12T09:49:19.100 に答える
1

numpy配列への追加は、新しいメモリを割り当てる必要があり、配列全体をコピーする必要があるため、低速な操作です。の行ごとにこれを行うのBは非効率的です。可能であれば、これは避けてください。

Aおよびminors(B)(以下を参照)の形状を事前に知っている場合は、最初から両方に対応できる十分な大きさのアレイを作成することをお勧めします。

あなたが求めていることをすることはたくさんありました。@sebergのアイデアは、とnp.lib.recfunctions.stack_arraysのdtypeが同じである限り、実行可能なソリューションになります。AB

これは別の可能性です。これはB、dtypeが異なっていても、または単なるndarrayまたはリストのリストであっても機能します。

import itertools
import numpy as np

def minors(arr):
    for row in arr:
        row = list(row)
        for i, elt in enumerate(row):
            if elt != 0:
                for val in row[:i]+[0]+row[i+1:]:
                    yield val

A = np.recarray((3,),dtype=[('x',float), ('y', float), ('z',float)])
B = [(7.0, 0.0, 7.0), (16.0, 0.0, 1.0)]

C = np.fromiter(itertools.chain(A.view(float), minors(B)), dtype = float)
C = C.view(A.dtype)
于 2012-10-12T11:31:54.637 に答える