我正在编写一些Python + NumPy + Cython代码,并尝试找到在数组上进行以下迭代的最优雅和高效的方法:
假设我有一个函数f(x, y),它接受形状为(3,)的向量x和形状为(10,)的向量y,并返回形状为(10,)的向量。现在我有两个形状分别为sx + (3,)和sy + (10,)的数组X和Y,其中sx和sy是可以广播在一起的两个形状(即sx == sy或者当轴不同时,其中一个长度为1,在这种情况下将被重复)。我想要生成一个形状为zs + (10,)的数组Z,其中zs是sx与sy的广播形状。Z中的每个10维向量都等于在X和Y中对应位置处的向量x和y的f(x, y)。
我研究了np.nditer,虽然它与cython很配合(请参见链接页面底部),但似乎不能迭代多维数组中的向量,而不是元素。我还看了一下index grids,但问题在于当索引数量等于数组维度并且存储为cython整数而不是python元组时,cython索引才快速。任何帮助都将不胜感激!
假设我有一个函数f(x, y),它接受形状为(3,)的向量x和形状为(10,)的向量y,并返回形状为(10,)的向量。现在我有两个形状分别为sx + (3,)和sy + (10,)的数组X和Y,其中sx和sy是可以广播在一起的两个形状(即sx == sy或者当轴不同时,其中一个长度为1,在这种情况下将被重复)。我想要生成一个形状为zs + (10,)的数组Z,其中zs是sx与sy的广播形状。Z中的每个10维向量都等于在X和Y中对应位置处的向量x和y的f(x, y)。
我研究了np.nditer,虽然它与cython很配合(请参见链接页面底部),但似乎不能迭代多维数组中的向量,而不是元素。我还看了一下index grids,但问题在于当索引数量等于数组维度并且存储为cython整数而不是python元组时,cython索引才快速。任何帮助都将不胜感激!
multi_index
可用于控制nditer
迭代的深度。基本上,您可以构建一个迭代器来遍历zs
的形状,并使用它来索引X
、Y
和输出。http://stackoverflow.com/a/25097271/901925 - hpaulj