【问题标题】:numpy iterate over two 2d arraysnumpy 遍历两个二维数组
【发布时间】:2016-01-02 18:41:57
【问题描述】:

假设我有两个矩阵:

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)),其中每个条目是通过在XY 的两个对应值上调用func 形成的,即:

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

有没有办法不用双嵌套for循环?

【问题讨论】:

  • 代码中有一个错字x**[1]
  • 这不就是Z = func([X, Y])吗?
  • 最好避免使用小数范围(如np.arange(0, 2, 0.1)),因为浮点不准确会导致不可预测的端点。请改用linspace

标签: python arrays numpy vectorization


【解决方案1】:

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

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])

【讨论】:

    【解决方案2】:

    对于给定的 numpy 数组 XY,你可以这样做 -

    Zout = X**2 + Y**2
    

    如果您实际上是这样构造XY,有一种直接的方法可以使用broadcasting 获得Z,从而避免np.meshgrid,就像这样-

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

    【讨论】:

    • 我的意思是任意函数,但您的回答仍然非常有用。你能解释一下 [:,None] 的作用吗?
    • @Tom 那一个是通过引入一个新的轴来扩展维度,没有。因此,在这种情况下,我们使用它将 1D 转换为 2D。这里扩展维度的想法是引入broadcasting
    猜你喜欢
    • 2018-04-22
    • 2016-09-04
    • 1970-01-01
    • 2022-01-06
    • 2013-03-14
    相关资源
    最近更新 更多