1

タイムステップ 1 から M までの N 個の粒子の ndim 座標を含むデータ配列があります。配列の列は通常、各粒子「p」の (x、y、z) を表し、配列の各行は別の時点を表します。 t':

x_t1p1  y_t1p1  z_t1p1  x_t1p2  y_t1p2  z_t1p2  ...  x_t1pN  y_t1pN  z_t1pN
x_t2p1  y_t2p1  z_t2p1  x_t2p2  y_t2p2  z_t2p2  ...  x_t2pN  y_t2pN  z_t2pN
...
x_tMp1  y_tMp1  z_tMp1  x_tMp2  y_tMp2  z_t1p2  ...  x_tMpN  y_tMpN  z_tMpN

各粒子がnumpy配列の異なる(M x ndim)「スライス」になるように、配列を3D形式に変換したいと思います。現在、次のことを行っています。

import numpy as np
def datarray_to_3D(data, ndim=3):
    (nr,nc) = data.shape
    nparticles = nc/ndim
    dat_3D = np.zeros([nr,ndim,nparticles])
    for i in range(nparticles):
        dat_3D[:,:,i] = data[:,i*ndim:(i+1)*ndim]
    return dat_3D 

NumPy の基本的な知識はありますが、配列操作の習熟度を高めたいと考えています。上記の関数を書き直してループをなくし、より「NumPythonic」な構造を使用するにはどうすればよいですか?

ありがとうございました。

-c

4

2 に答える 2

2

あなたの機能とは少し異なるオリジナルのソリューション。

def datarray_to_3D(data, nparticles=3):
    nr, nc = data.shape
    data = data.reshape(nr, nparticles, nc/nparticles)
    return np.rollaxis(data, 2, 1)

更新:間違いをより明確にするために元の回答を更新しました。それを見つけてくれてありがとうunutbu。私のソリューションは、 wherenparticlesの代わりに引数として取りました。variable の名前を変更したこともあり、間違いを犯しました。この場合、配列の次元数である属性とあまりにも似ているため、変数名として使用することは避けます。これが更新されたソリューションですが、dim1` を置き換えました。元の機能により似ています。ndimnparticles * ndim == data.shape[1]ndimndimdata.ndimndim by

def datarray_to_3D(data, dim1=3):
    nr, nc = data.shape
    data = data.reshape(nr, nc/dim1, dim1)
    return np.rollaxis(data, 2, 1)
于 2012-08-07T17:44:46.657 に答える
1

どうですか:

def alt_3D(data, ndim=3):
    nr, nc = data.shape
    result = data.reshape(nr,-1,3).transpose(0,2,1)
    return result

たとえば、

data = np.arange(18).reshape((-1,6))

次に、次alt_3D(data)の結果が得られます。

[[[ 0  3]
  [ 1  4]
  [ 2  5]]

 [[ 6  9]
  [ 7 10]
  [ 8 11]]

 [[12 15]
  [13 16]
  [14 17]]]

(これは、Bago の回答とは異なる結果です。)

于 2012-08-07T18:50:45.447 に答える