пустая нецелочисленная сетка

Я новичок в numpy и пытаюсь найти способ 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)

Я в основном хочу того же, но использую поплавки для определения значений.

Я определяю размеры коробки и количество частей 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)

Теперь, как я должен объединить их, чтобы получить массив всех точек в моей сетке? Спасибо за уделенное время!


person feedMe    schedule 18.05.2012    source источник
comment
Возможный дубликат ( stackoverflow.com/questions/1827489/numpy-meshgrid-in-3d)   -  person mgilson    schedule 18.05.2012
comment
@mgilson, я думаю, что feedMe может спрашивать немного о другом; ndindex возвращает генератор, а не массив. Но это не на 100% ясно из вопроса.   -  person senderle    schedule 18.05.2012
comment
Извините, если вы нашли мой вопрос неясным. Мне нужно прочитать о генераторах дальше.   -  person feedMe    schedule 18.05.2012


Ответы (2)


Я нахожу ваш вопрос немного запутанным, потому что 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. ]]]])
person senderle    schedule 18.05.2012
comment
Спасибо, отправитель. Теперь у меня есть следующее, что делает то, что я хотел. a = list(np.broadcast(*np.ix_(xspace, yspace, zspace))) :) - person feedMe; 18.05.2012

Как насчет того, чтобы просто:

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]]]])
person sega_sai    schedule 14.06.2012