【问题标题】:How can I calculate an outer function in python?如何在python中计算外部函数?
【发布时间】:2017-08-03 23:30:11
【问题描述】:

如果我有一个像 func(x,y) = cos(x) + sen(y) + x*y 这样的随机函数,我如何将它应用于 2 个数组中的所有元素对?

我找到了https://docs.scipy.org/doc/numpy/reference/generated/numpy.outer.html 和 发现所有基本操作都有外部函数。但是如果我想用自定义函数来做呢?

假设array1是[1,2],array2是[3,4],我想应用的函数叫做f(float, float)

预期的输出是

[f(1,3) f(1,4)

f(2,3) f(2,4)]

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    只要确保编写函数以使其正确广播,就可以这样做

    func(x_arr[:, None], y_arr)
    

    将其应用于两个一维数组x_arry_arr 中的所有元素对。

    例如,要以广播的方式编写示例函数,您可以将其编写为

    def func(x, y):
        return np.cos(x) + np.sin(y) + x*y
    

    因为np.cosnp.sin+* 跨数组广播和矢量化。


    至于不播呢?好吧,有些人可能会建议 np.vectorize,但这有很多棘手的事情你必须记住,比如保持一致的输出 dtype 并且没有副作用。如果您的函数不广播,我建议只使用列表推导:

    np.array([[func(xval, yval) for yval in y_arr] for xval in x_arr])
    

    【讨论】:

      【解决方案2】:

      解决这个问题的一种方法是广播:

      import numpy as np
      
      def func(x, y):
          x, y = np.asarray(x)[:, None], np.asarray(y)
          return np.cos(x) + np.sin(y) + x*y
      

      [:, None] 向数组添加另一个维度,因此触发 NumPys broadcasting

      >>> func([1,2], [3,4])
      array([[ 3.68142231,  3.78349981],
             [ 5.72497317,  6.82705067]])
      

      【讨论】:

        【解决方案3】:

        您可以使用嵌套循环来执行此操作。使用一个数组中的单个元素,遍历另一个数组中的所有元素,然后继续到第一个数组中的下一个元素并重复。

        如果您只想打印结果,这会很简单,如果您想将结果存储到另一个数组中,这仍然有效,它只是使用大量资源。

        【讨论】:

          猜你喜欢
          • 2020-12-06
          • 1970-01-01
          • 2020-11-23
          • 2021-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多