Python numpy在两个二维数组上迭代
假设我有两个矩阵:Python numpy在两个二维数组上迭代,python,arrays,numpy,vectorization,Python,Arrays,Numpy,Vectorization,假设我有两个矩阵: 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循环的方法?对于给定的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循环的方法?对于给定的numpy数组
X
和Y
,您可以这样做-
Zout = X**2 + Y**2
如果您实际上是这样构造X
和Y
,那么有一种直接的方法可以获得Z
,从而避免np.meshgrid
,就像这样-
Zout = np.arange(0, 2, 0.1)**2 + np.arange(3, 5, 0.1)[:,None]**2
对于给定的numpy数组
X
和Y
,您可以-
Zout = X**2 + Y**2
如果您实际上是这样构造X
和Y
,那么有一种直接的方法可以获得Z
,从而避免np.meshgrid
,就像这样-
Zout = np.arange(0, 2, 0.1)**2 + np.arange(3, 5, 0.1)[:,None]**2
这也是功能评估的矢量化形式:
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])
这也是功能评估的矢量化形式:
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])
代码中有一个输入错误
x**[1]
。这不就是Z=func([x,Y])
?最好避免小数范围(如np.arange(0,2,0.1)
),因为浮点不准确可能导致无法预测的端点。改为使用linspace
。代码中有一个打字错误x**[1]
。这不就是Z=func([x,Y])
?最好避免小数范围(如np.arange(0,2,0.1)
),因为浮点不准确可能导致无法预测的端点。改用linspace
。我的意思是针对任意函数,但您的答案仍然非常有用。你能解释一下[:,None]是做什么的吗?@Tom,其中一个是通过引入一个新的无轴来扩展维度。因此,在这种情况下,我们用它将一维转换为二维。扩展维的想法是引入。我的意思是对于任意函数,但是你的答案仍然是非常有用的。你能解释一下[:,None]是做什么的吗?@Tom,其中一个是通过引入一个新的无轴来扩展维度。因此,在这种情况下,我们用它将一维转换为二维。在这里,扩展维度的想法是引入。