numpy.mgrid在技术上是什么?

6

我一直在使用 numpy.mgrid,并且熟悉它的功能。但是自从开始使用以来,我一直在想它到底是什么...

mgrid 的典型用法和语法如下:

xx, yy = mgrid[0:5, 0:3]

我困惑的是语法mgrid[...],这使我相信mgrid不是一个函数或方法。根据文档mgrid是一个nd_grid实例,返回一个密集的多维“网格”。

它在后台做什么?为什么像函数一样使用,但语法与函数不同(我期望类似于mgrid((0,5), (0,3)))。我真的很难理解mgrid是什么。

欢迎任何见解!

1个回答

7

numpy.mgridnumpy/index_tricks.pyMGridClass 的一个对象。该对象允许您构造多维网格,正如您已经知道的那样。

MGridClass 扩展了 nd_grid,该类实现了一个 __getitem__ 方法。方括号实际上代理对 nd_grid.__getitem__ 的调用,后者根据传递的切片实现构建网格的核心逻辑。

关于 nd_grid 工作原理的简要 MCVE 可在此处找到。

class dummy_1d_grid:
    def __getitem__(self, val):
        print(val)
        return np.arange(val.start, val.stop, val.step, )

mgrid_1d = dummy_1d_grid()
mgrid_1d[:5]

slice(0, 5, None)
# array([0, 1, 2, 3, 4])

np.mgrid[0:5]
# array([0, 1, 2, 3, 4])

当然,这些都是具体实现细节,因此布局和类都可能会发生变化。需要关注的重点是它是一个实现了__getitem__方法的类的实例。因此,它是被切片而不是调用。

1
话虽如此,了解类型实际上并不是非常有用的。重要的是行为,而知道类型几乎没有什么作用。只要NumPy开发人员保持文档化的行为,即使他们将其更改为完全不同的类型,也无关紧要。 - user2357112
@coldspeed 感谢你,我现在完全明白了,不过我一直想知道这个 __getitem__ 语法是否不太符合 Python 的特点。相比我之前见过的大部分 Python 语言结构,它似乎很独特?为什么要选择这种方式而不是函数调用呢? - mommermi
我同意。因此,效率优先于一致性。 - mommermi
@mommermi,不要忘记可读性。我觉得后者更容易理解。使用“:”指定切片比直接使用“slice”对象更自然。 - cs95
1
meshgrid是函数等效的,或多或少。 - hpaulj
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接