【问题标题】:Use of numpy fromfunctionnumpy fromfunction 的使用
【发布时间】:2016-11-18 08:25:05
【问题描述】:

我试图使用 fromfunction 创建一个高斯值为 mu=3 和 sig=2 的 5x5 矩阵,这是我的尝试:

from random import gauss
import numpy as np
np.fromfunction(lambda i,j: gauss(3,2), (5, 5))

这是结果:5.365244570434782

正如我从docs 了解到的那样,这应该可行,但我得到的是一个标量而不是 5x5 矩阵......为什么?以及如何解决这个问题?

【问题讨论】:

    标签: python numpy lambda


    【解决方案1】:

    numpy.fromfunction 文档极具误导性。 fromfunction 实际上只对您传递的函数进行一次调用,而不是重复调用您的函数并从结果中构建一个数组。在那一次调用中,它将许多索引数组传递给您的函数,而不是单独的索引。

    剥离docstring,实现如下:

    def fromfunction(function, shape, **kwargs):
        dtype = kwargs.pop('dtype', float)
        args = indices(shape, dtype=dtype)
        return function(*args,**kwargs)
    

    这意味着除非您的函数广播,否则numpy.fromfunction 不会像文档所说的那样做任何事情。

    【讨论】:

    • 那么在我的用例中你将如何使用 fromfunction?
    • @OfekRon 我不知道。但是,我相信 numpy 有一个 random 模块,它应该已经提供了使用高斯分布等元素创建数组的能力......
    • @OfekRon:我不会。我会使用numpy.random.normal 而不是random.gauss
    • @user2357112 np.random.normal(3,2,(5,5)) 效果很好!,想知道为什么高斯函数存在但是哦,好吧
    • @OfekRon 那是因为 python 的 random 模块与 numpy 的 random 模块不同。
    【解决方案2】:

    我知道这是一篇旧帖子,但对于任何偶然发现此问题的人来说,它不起作用的原因是,lambda 中的表达式没有使用 i, j 变量

    你需要什么,你可以这样实现:

    np.zeros((5, 5)) + gauss(3, 2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 2018-09-01
      • 2011-01-14
      • 2019-03-16
      • 1970-01-01
      • 2017-06-24
      相关资源
      最近更新 更多