1

配列内のオブジェクトをグループ化するための適切な順序付けられた方法を作成しようとしています。今、私は次のことを試しましたが、エラーが発生します。

任意のヒント?

#body: mass, [x,y], [vx,vy], [ax, ay]
bodies = np.array([[1E3, [0,0], [0,0], [0.0]],\
          [1, [0,200], [31.6,0], [0,0]]])

ValueError: 配列要素をシーケンスで設定しています。

4

2 に答える 2

3

を使用dtype=objectして、浮動小数点数、タプル、リスト、配列など、必要なものを何でも格納できます。しかし、実際には、それは良い考えではありません。あなたはnumpyのすべての利点をほとんど失います。

そして、それは悪い考えであるため、numpy を使用しても簡単にはなりません。リストから配列を構築すると、サブリストが配列の次元であると想定され、そのように意味をなさない場合、このエラーが発生します。

体を数値のフラットな行として保存しないのはなぜですか? 行をより高いレベルで本体として解釈する必要がx, y = bodies[1][1]ありx, y = bodies[1][1:3]ます。

どうしてもやりたければ、もう 1 次元の配列を作成することもできますが、なぜでしょうか?

また、生の numpy の代わりに pandas を使用するか、最初に numpy を使用する代わりにデータベースを使用するか、それぞれbodyを Python オブジェクトとして保持する (numpy 配列に貼り付けるかどうかに関係なく)、またはまったく別のものを検討することもできます。 . 何を達成しようとしているのかを知らなければ、何がニーズに合うかを確認することは困難です。しかし、あなたがやろうとしていることが正しいことである可能性はほとんどありません。

于 2013-05-24T21:32:11.643 に答える
2

複雑な dtype を使用できます。

bodies = np.array([(1E3, [0,0], [0,0], [0.0]), 
                   (1, [0,200], [31.6,0], [0,0])], 
                   dtype=[('mass',float), ('xy','2float'), 
                          ('vxy','2float'), ('axy','2float')])

で「列」にアクセスします

In [63]: bodies['mass']
Out[63]: array([ 1000.,     1.])

In [64]: bodies['xy']
Out[64]: 
array([[   0.,    0.],
       [   0.,  200.]])

などですが、これで生活が楽になるわけではありません。


n体シミュレーターを作っています

オブジェクト間の距離を計算することは、nボディ シミュレータでは一般的な操作です。scipy.spatial.distance pdistまたはそのために使用したい場合がcdistあります。これらの関数はX、単純で同種の dtype の NumPy ndarray であることを想定していることに注意してください。したがって、複雑な dtype の配列を使用する場合は、これらの関数を使用する前に、最初にスライスする必要があります。

したがって、単純で同種の dtype の配列を最初から格納し、複雑な dtype の配列を避ける方がおそらく簡単でしょう。

複数の 1 次元配列を作成することをお勧めします。

mass = np.array(...)
x = np.array(...)
y = np.array(...)

または、単純で同種の dtype の 2D 配列を使用することもできます。

pos = np.array([(x0, y0), (x1, y1), ...], dtype='float')

この方法でも、すべての方程式が読みやすくなります。2D 位置配列にアクセスする代わりに、bodies['xy']単にpos. これにより、解析しなければならない括弧のセットが 1 つ少なくなります。

于 2013-05-24T21:41:17.247 に答える