python:从网格节点构建网格迭代器

sim*_*ona 4 python iterator numpy python-3.x

我正在使用 python 3 我想从 3 维节点列表开始并构建一个网格。我想避免构造

import numpy as np
l = np.zeros(len(xv)*len(yv)*len(zv))
for (i,x) in zip(range(len(xv)),xv):
   for (j,y) in zip(range(len(yv)),yv):
       for (k,z) in zip(range(len(zv)),zv):
           l[i,j,k] = func(x,y,z)
Run Code Online (Sandbox Code Playgroud)

我正在寻找上述几行的更紧凑版本。类似于 的迭代器zip,但它将迭代网格中所有可能的元组

mgi*_*son 5

您可以使用类似的东西np.meshgrid来构建网格。假设它func被正确矢量化,那么应该足以构建l

X, Y, Z = np.meshgrid(xv, yv, zv)
l = func(X, Y, Z)
Run Code Online (Sandbox Code Playgroud)

如果func 矢量化,您可以使用 构建矢量化版本np.vectorize

另请注意,您甚至可以np.meshgrid通过明智地使用以下内容而无需使用np.newaxis

>>> x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> y
array([0, 1, 2])
>>> z
array([0, 1])
>>> def func(x, y, z):
...     return x + y + z
... 
>>> vfunc = np.vectorize(func)
>>> vfunc(x[:, np.newaxis, np.newaxis], y[np.newaxis, :, np.newaxis], z[np.newaxis, np.newaxis, :])
array([[[ 0,  1],
        [ 1,  2],
        [ 2,  3]],

       [[ 1,  2],
        [ 2,  3],
        [ 3,  4]],

       [[ 2,  3],
        [ 3,  4],
        [ 4,  5]],

       [[ 3,  4],
        [ 4,  5],
        [ 5,  6]],

       [[ 4,  5],
        [ 5,  6],
        [ 6,  7]],

       [[ 5,  6],
        [ 6,  7],
        [ 7,  8]],

       [[ 6,  7],
        [ 7,  8],
        [ 8,  9]],

       [[ 7,  8],
        [ 8,  9],
        [ 9, 10]],

       [[ 8,  9],
        [ 9, 10],
        [10, 11]],

       [[ 9, 10],
        [10, 11],
        [11, 12]]])
Run Code Online (Sandbox Code Playgroud)

正如评论中指出的,np.ix_可以用作快捷方式而不是np.newaxis

vfunc(*np.ix_(xv, yv, zv))
Run Code Online (Sandbox Code Playgroud)

另请注意,使用这个愚蠢的简单函数np.vectorize是没有必要的,并且实际上会严重损害我们的性能......