teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

説明追加

2021/01/07 09:15

投稿

ppaul
ppaul

スコア24672

answer CHANGED
@@ -25,4 +25,8 @@
25
25
  (array([0., 0., 0., 0., 0., 0., 0.]), 0., 0.)
26
26
  (array([0., 0., 0., 0., 0., 0., 0., 0.]), 0., 0.)
27
27
  (array([0., 0., 0., 0., 0., 0., 0., 0., 0.]), 0., 0.)]
28
- ```
28
+ ```
29
+
30
+ structured arrayはC言語の構造体配列のようなものというか、そのものです。
31
+ structured arrayの各要素は同じだけのバイト数でなければなりません。これはC言語と同じなので当然です。
32
+ C言語の構造体配列には可変長のメンバを指定することができなくて必要とあればポインタを入れておいてその先に可変長のデータを置く、というのと同じだと考えてください。

1

説明追加

2021/01/07 09:15

投稿

ppaul
ppaul

スコア24672

answer CHANGED
@@ -1,3 +1,28 @@
1
1
  可変長のデータをnumpyのndarrayで直接作ることは出来ません。
2
2
 
3
- dtypeをobjectにして、その先に別のものを入れることで実現します。
3
+ dtypeをobjectにして、その先に別のものを入れることで実現します。
4
+
5
+ 例えばこんな感じです。
6
+
7
+ ```ここに言語を入力
8
+ >>> PLAIN = np.dtype([('points', object),
9
+ ... ('mean', np.float32),
10
+ ... ('cov', np.float32),
11
+ ... ],
12
+ ... align=True
13
+ ... )
14
+ >>>
15
+ >>> p = np.zeros(10, dtype=PLAIN)
16
+ >>>
17
+ >>> for i in range(10):
18
+ ... p[i]['points'] = np.zeros(i)
19
+ ...
20
+ >>> print(p)
21
+ [(array([], dtype=float64), 0., 0.) (array([0.]), 0., 0.)
22
+ (array([0., 0.]), 0., 0.) (array([0., 0., 0.]), 0., 0.)
23
+ (array([0., 0., 0., 0.]), 0., 0.) (array([0., 0., 0., 0., 0.]), 0., 0.)
24
+ (array([0., 0., 0., 0., 0., 0.]), 0., 0.)
25
+ (array([0., 0., 0., 0., 0., 0., 0.]), 0., 0.)
26
+ (array([0., 0., 0., 0., 0., 0., 0., 0.]), 0., 0.)
27
+ (array([0., 0., 0., 0., 0., 0., 0., 0., 0.]), 0., 0.)]
28
+ ```