質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1159閲覧

[Python]クラスを2重で格納した配列の作成

Takapyon

総合スコア2

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/12/25 13:16

編集2021/12/25 16:23

前提・実現したいこと

pythonでクラスを2重で格納した配列を作成したいです。
pythonでの記述方法がわからないのでC++で実現したいコードを書きました。
ご教示いただければ幸いです。
よろしくおねがいします。

試しに書いたPythonのコード

Python

1import numpy as np 2 3class Vector3D: 4 x = 0 5 y = 0 6 z = 0 7 8class PointCloud: 9 pc = Vector3D() 10 11pc1 = PointCloud() 12pc2 = PointCloud() 13pc3 = PointCloud() 14pc4 = PointCloud() 15 16pc_arr = [pc1,pc2,pc3,pc4] 17

クラスのPointCloud内のpcは2次元配列で各要素にクラスVector3Dを持つようにしたいです。

Pythonで実現したいC++のコード

C++

1#include<iostream> 2#include<vector> 3 4class Vector3D{//三次元ベクトルクラスを作成 5public: 6 float X; 7 float Y; 8 float Z; 9}; 10 11class PointCloud{//三次元ベクトルを各要素に持つ2次元配列クラスを作成 12public: 13 std::vector<std::vector<Vector3D> > pc; 14}; 15 16std::vector<PointCloud> arr_pc(4); //クラスPointCloudを配列で定義 17 18int main(int argc, char const *argv[]) 19{ 20 arr_pc[0].pc.resize(2,std::vector<Vector3D>(3)); //arr_pc[0].pcを2✕3でリサイズ 21 arr_pc[0].pc[1][2].X = 100.0; //要素に値を代入 22 23 std::cout << arr_pc[0].pc[1][2].X << std::endl; 24 25 return 0; 26} 27 28 29

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

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

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

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

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

meg_

2021/12/25 13:33

> pythonでの記述方法がわからないのでC++で実現したいコードを書きました pythonはどの程度知っていますか?
Takapyon

2021/12/25 13:44

pythonの基本構文は知っています。 普段はROSでpythonを使用しています。
meg_

2021/12/25 13:56

今の質問ですとC++のコードをpythonで書いてほしいとの丸投げの印象です。途中まででも良いのでpythonコードを追記いただけませんか?
Takapyon

2021/12/25 14:40 編集

あまりに丸投げな質問の仕方でした。 申し訳ございません。 汚いコードですが書いてみました。 PointCloudクラスを配列で定義できていないのと、 (クラスPointCloudは2次元配列で要素にクラスVector3Dを持つものを作りたいです) 要素へのアクセス方法、 がわからない状況です。 重ね重ね申し訳ございません。 ``` import numpy as np class Vector3D: x = 0 y = 0 z = 0 class PointCloud: pc = Vector3D() pc1 = PointCloud() pc2 = PointCloud() pc3 = PointCloud() pc4 = PointCloud() pc_arr = [pc1,pc2,pc3,pc4] ```
meg_

2021/12/25 16:08

質問は編集出来ますのでコードは質問に追記しましょう。 ちなみに上記コードでnumpyをインポートしていますが使用していません。numpyの使い方が分からないというのが質問でしょうか?
Takapyon

2021/12/25 16:15

わかりました、ご指摘ありがとうございます。 はい、numpyのndarrayで定義したいです
guest

回答2

0

クラスを自分で定義することが目的でなく、3つのメンバを持つ二次元配列を作って使いたいという話であれば、numpyのStructured arraysをそのまま使えばよいでしょう。

Structured arraysをお読みください。

投稿2021/12/26 01:01

ppaul

総合スコア24670

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

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

Takapyon

2021/12/26 05:48

このような書き方があるのですね、、、 とても参考になりました! ありがとうございましたm(_ _)m
guest

0

ベストアンサー

はい、numpyのndarrayで定義したいです

Vector3D クラスは numpy.ndarray を継承(inheritance)する様にしています。なお、PointCloud.resize() メソッドでは手抜きをしているので、リサイズできるのは1回だけです。

python

1import numpy as np 2 3class Vector3D(np.ndarray): 4 """三次元ベクトルクラス""" 5 def __new__(cls, x=0, y=0, z=0): 6 obj = np.array((x, y, z), 7 dtype=[('X', np.float64), ('Y', np.float64), ('Z', np.float64)])\ 8 .view(cls) 9 return obj 10 11 @property 12 def X(self): return self['X'].item() 13 @property 14 def Y(self): return self['Y'].item() 15 @property 16 def Z(self): return self['Z'].item() 17 18 @X.setter 19 def X(self, value): self['X'] = value 20 @Y.setter 21 def Y(self, value): self['Y'] = value 22 @Z.setter 23 def Z(self, value): self['Z'] = value 24 25class PointCloud(): 26 """三次元ベクトルを各要素に持つ2次元配列クラス""" 27 def __init__(self): 28 self.pc = [] 29 30 def __getitem__(self, item): 31 return self.pc[item] 32 33 def resize(self, nrows, ncols): 34 if not self.pc: 35 self.pc = np.array([ 36 [Vector3D() for _ in range(ncols)] for _ in range(nrows) 37 ], dtype=object) 38 39if __name__ == '__main__': 40 from pprint import pprint 41 42 arr_pc = [PointCloud() for _ in range(4)] 43 arr_pc[0].resize(2, 3) 44 arr_pc[0][1,2].X = 100.0 45 pprint(arr_pc[0][1,2].X) 46 47 pprint(type(arr_pc[0])) 48 pprint(type(arr_pc[0][0,0])) 49 pprint(arr_pc[0][:]) 50 51# 52100.0 53<class '__main__.PointCloud'> 54<class '__main__.Vector3D'> 55array([[Vector3D((0., 0., 0.), dtype=[('X', '<f8'), ('Y', '<f8'), ('Z', '<f8')]), 56 Vector3D((0., 0., 0.), dtype=[('X', '<f8'), ('Y', '<f8'), ('Z', '<f8')]), 57 Vector3D((0., 0., 0.), dtype=[('X', '<f8'), ('Y', '<f8'), ('Z', '<f8')])], 58 [Vector3D((0., 0., 0.), dtype=[('X', '<f8'), ('Y', '<f8'), ('Z', '<f8')]), 59 Vector3D((0., 0., 0.), dtype=[('X', '<f8'), ('Y', '<f8'), ('Z', '<f8')]), 60 Vector3D((100., 0., 0.), dtype=[('X', '<f8'), ('Y', '<f8'), ('Z', '<f8')])]], 61 dtype=object)

投稿2021/12/25 23:07

編集2021/12/25 23:43
melian

総合スコア20655

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

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

Takapyon

2021/12/26 05:53

とても参考になるコードありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問