2012-05-18 29 views
1

我是新来的numpy,我正试图找到Pythonic :)方法来生成一个规则的3D网格点。numpy非整数网格

随着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) 

我基本上想同样的事情,但使用浮动来定义值。

我定义了框的尺寸和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) 

现在,我应该如何组合这些给我一个在我的网格中的所有点的数组? 谢谢你的时间!

+1

可能的复制(http://stackoverflow.com/questions/1827489/numpy-meshgrid-in-3d) – mgilson

+0

@mgilson,我认为feedMe可能提出稍微不同的问题; 'ndindex'返回一个生成器,而不是一个数组。但是这个问题并没有100%清楚。 – senderle

+0

对不起,如果你发现我的问题不清楚。接下来我需要阅读发电机。 – feedMe

回答

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. ]]]]) 
+0

谢谢,senderle。我现在有以下这个,做我想要的。 'a = list(np.broadcast(* np.ix_(xspace,yspace,zspace)))' :) – feedMe

0

如何简单地认为:

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]]]])