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,但它将迭代网格中所有可能的元组
您可以使用类似的东西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是没有必要的,并且实际上会严重损害我们的性能......
| 归档时间: |
|
| 查看次数: |
5851 次 |
| 最近记录: |