🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

1回答

2403閲覧

PythonのStructured Datatypesで、objに可変長の配列を持たせたい

marusa

総合スコア17

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2021/01/07 08:17

編集2021/01/07 08:18

前提・実現したいこと

Pythonで構造体のようなデータを取り扱おうとしています。
以下の記事を参考に作成しようとしていたのですが、np.dtypeの引数objについて、
中身に可変長の配列を持たせたいと考えました。
https://qiita.com/minoru-github/items/95778a425b3f0a60f78c

発生している問題・エラーメッセージ

可変長の配列を、どのように指定すればいいのかがわからない。

該当のソースコード

Python

1PLAIN = np.dtype([('points', np.float32, (,)), # この行の(,)に指定する値 2 ('mean', np.float32, (1,)), 3 ('cov', np.float32, (1,)), 4 ], 5 align=True 6 ) 7 8p = np.zeros((1, 0), dtype=PLAIN) 9 10print(p)

試したこと

参考記事で紹介されているサイトの内容も確認してみましたが、特に記載はありませんでした。(見落としていたら申し訳ありません。)
指定しているのはshapeだろう、と考えて、shape 可変長 と調べてみましたが該当しそうなものは見つかりませんでした。

ひとまず適当なサイズで作っておいて、後からnp.appendしようと以下のコードを試してみたものの、
キャストできないという以下のエラーが出ます。

p['points'][0] = np.append(p['points'][0], points, axis = 0) ValueError: could not broadcast input array from shape (4,2) into shape (2,2)

Python

1PLAIN = np.dtype([('points', np.float32, (2,2)), 2 ('mean', np.float32, (1,)), 3 ('cov', np.float32, (1,)), 4 ], 5 align=True 6 ) 7 8p = np.zeros(1, dtype=PLAIN) 9 10points = np.array([[1, 1], [1, 2]]) 11p['points'][0] = np.append(p['points'][0], points, axis = 0) 12print(p)

補足情報(FW/ツールのバージョンなど)

Python 2.7
numpy 1.16.6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

可変長のデータをnumpyのndarrayで直接作ることは出来ません。

dtypeをobjectにして、その先に別のものを入れることで実現します。

例えばこんな感じです。

>>> PLAIN = np.dtype([('points', object), ... ('mean', np.float32), ... ('cov', np.float32), ... ], ... align=True ... ) >>> >>> p = np.zeros(10, dtype=PLAIN) >>> >>> for i in range(10): ... p[i]['points'] = np.zeros(i) ... >>> print(p) [(array([], dtype=float64), 0., 0.) (array([0.]), 0., 0.) (array([0., 0.]), 0., 0.) (array([0., 0., 0.]), 0., 0.) (array([0., 0., 0., 0.]), 0., 0.) (array([0., 0., 0., 0., 0.]), 0., 0.) (array([0., 0., 0., 0., 0., 0.]), 0., 0.) (array([0., 0., 0., 0., 0., 0., 0.]), 0., 0.) (array([0., 0., 0., 0., 0., 0., 0., 0.]), 0., 0.) (array([0., 0., 0., 0., 0., 0., 0., 0., 0.]), 0., 0.)]

structured arrayはC言語の構造体配列のようなものというか、そのものです。
structured arrayの各要素は同じだけのバイト数でなければなりません。これはC言語と同じなので当然です。
C言語の構造体配列には可変長のメンバを指定することができなくて必要とあればポインタを入れておいてその先に可変長のデータを置く、というのと同じだと考えてください。

投稿2021/01/07 08:50

編集2021/01/07 09:15
ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問