2016-01-02 24 views
0

numpy的迭代说我有两个矩阵:了两个二维数组

X, Y = np.meshgrid(np.arange(0, 2, 0.1), np.arange(3, 5, 0.1)) 

和一个函数,是这样的:

def func(x) : 
    return x[0]**2 + x[1]**2 

我怎么能填充基质Z(大小np.shape( X)),其中,每个条目是通过调用func上的X两个相应值和Y,即形成:

Z[i, j] = func([X[i, j], Y[i, j]]) 

有没有一种方法不使用双嵌套的for-loop?

+4

代码中有一个错字'x ** [1]'。 – NKN

+1

这不就是'Z = func([X,Y])'吗? –

+2

最好避免使用分数范围(比如'np.arange(0,2,0.1)'),因为浮点不准确会导致不可预测的终点。改用'linspace'。 –

回答

3

这也可以作为矢量化函数评估形式:

import numpy as np 
X, Y = np.meshgrid(np.arange(0, 2, 0.1), np.arange(3, 5, 0.1)) 
def func(x) : 
    return x[0]**2 + x[1]**2 

Z = func([X,Y]) 
3

对于给定的numpy的阵列XY,你可能只是做 -

Zout = X**2 + Y**2 

如果你实际上是构建XY这样的,有一个直接的方式来获得Zbroadcasting从而避免np.meshgrid,像这样 -

Zout = np.arange(0, 2, 0.1)**2 + np.arange(3, 5, 0.1)[:,None]**2 
+0

我的意思是任意功能,但你的答案仍然是非常丰富的。你能否解释一下[:,没有]请问? – Tom

+1

@Tom通过引入一个新的轴来扩展维度。因此,在这种情况下,我们将1D转换为2D。这里扩展维度的想法是引入['broadcast'](http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html)。 – Divakar