1

私はnumpyを初めて使用し、通常の3Dポイントグリッドを生成するPythonic:)の方法を見つけようとしています。

numpyを使用すると、ndindex関数はほぼ私が望むことを実行しますが、整数でのみ機能することがわかりました。

import numpy as np
ind=np.ndindex(2,2,1)
for i in ind:
    print(i)


>>>(0, 0, 0)
(0, 1, 0)
(1, 0, 0)
(1, 1, 0)

基本的に同じことをしたいのですが、floatを使用して値を定義します。

ボックスの寸法とx、z、zの細分割の数を定義します。

x、y、z次元の線形空間を作成することから始めましょう。

import numpy as np
corner1 = [0.0, 0.0, 0.0]
corner2 = [1.0, 1.0, 1.0]

nx, ny, nz = 5, 3, 7

xspace = np.linspace(corner1[0], corner2[0], nx)
yspace = np.linspace(corner1[1], corner2[1], ny)
zspace = np.linspace(corner1[2], corner2[2], nz)

では、これらをどのように組み合わせて、グリッド内のすべてのポイントの配列を作成する必要がありますか?お時間をいただきありがとうございます!

4

2 に答える 2

3

ジェネレータを返すので、あなたの質問は少し紛らわしいと思いますndindexが、あなたはn次元配列を求めているようです。ジェネレーターは非常に簡単です。

>>> list(numpy.broadcast(*numpy.ix_(x, y, z)))
[(0.0, 0.0, 0.0),
 (0.0, 0.0, 1.0),
 (0.0, 0.5, 0.0),
 (0.0, 0.5, 1.0),
 (0.0, 1.0, 0.0),
 (0.0, 1.0, 1.0),
 (1.0, 0.0, 0.0),
 (1.0, 0.0, 1.0),
 (1.0, 0.5, 0.0),
 (1.0, 0.5, 1.0),
 (1.0, 1.0, 0.0),
 (1.0, 1.0, 1.0)]

配列にパックするには、配列を作成して形状を変更します。値のトリプレットはそれ自体の次元であることに注意してください(したがって、3最後に余分なものがあります)。

>>> numpy.array(list(numpy.broadcast(*numpy.ix_(x, y, z)))).reshape((2, 3, 2, 3))
array([[[[ 0. ,  0. ,  0. ],
         [ 0. ,  0. ,  1. ]],

        [[ 0. ,  0.5,  0. ],
         [ 0. ,  0.5,  1. ]],

        [[ 0. ,  1. ,  0. ],
         [ 0. ,  1. ,  1. ]]],


       [[[ 1. ,  0. ,  0. ],
         [ 1. ,  0. ,  1. ]],

        [[ 1. ,  0.5,  0. ],
         [ 1. ,  0.5,  1. ]],

        [[ 1. ,  1. ,  0. ],
         [ 1. ,  1. ,  1. ]]]])
于 2012-05-18T15:26:43.767 に答える
1

簡単に言うと:

xyz = numpy.mgrid[0:3:0.1, 0:2:0.2, 0:1:0.5]
print xyz
array([[[[ 0. ,  0. ],
     [ 0. ,  0. ],
     [ 0. ,  0. ],
     ...,

    [[ 0.1,  0.1],
     [ 0.1,  0.1],
     [ 0.1,  0.1],
     ...,
    [[ 0.2,  0.2],
     [ 0.2,  0.2],
     [ 0.2,  0.2]]
    ...,
    [[ 2.9,  2.9],
     [ 2.9,  2.9],
     [ 2.9,  2.9],
    ...
   [[[ 0. ,  0. ],
     [ 0.2,  0.2],
     [ 0.4,  0.4],
     ...,
     [ 0. ,  0.5],
     [ 0. ,  0.5],
     [ 0. ,  0.5]]]])
于 2012-06-14T09:33:09.863 に答える