1

我有一个基本上返回广义谐波数的函数。

def harmonic(limit, z):
   return numpy.sum(1.0/numpy.arange(1, limit+1)**z)

以下是当前函数定义的两个示例:

>>> harmonic(1, 1)
1.0
>>> harmonic(2, 1)
1.5

正如您可能猜到的那样,当它是标量时它工作得很好limit,但是我怎样才能使这个函数也适用于 1D 和 2D 数组呢?

下面演示我要实现的功能的示例输出

>>> limit = np.array([[1, 2], [3, 4]])
>>> harmonic(limit, 1)
array([[1.0, 1.5], [1.833, 2.083]])
4

2 回答 2

5

如果您只对矢量化limit而不感兴趣z,如您展示的示例所示,那么我认为您可以使用np.vectorize

>>> h = np.vectorize(harmonic)
>>> h(1, 1)
array(1.0)
>>> h(2, 1)
array(1.5)
>>> h([[1,2], [3,4]], 1)
array([[ 1.        ,  1.5       ],
       [ 1.83333333,  2.08333333]])
>>> h([[1,2], [3,4]], 2)
array([[ 1.        ,  1.25      ],
       [ 1.36111111,  1.42361111]])

请注意,这将为标量情况返回 0 维数组。

实际上,再想一想,它也应该适用于这种z情况:

>>> h([[2,2], [2,2]], [[1,2],[3,4]])
array([[ 1.5   ,  1.25  ],
       [ 1.125 ,  1.0625]])
于 2013-05-12T17:52:48.260 回答
0

arange[1,limit+1]在您的示例中生成范围内均匀分布的一维 ndarray 。

现在说你想要一个均匀分布的数组的多暗 ndarray。然后您可以使用arange生成 2D ndarray 的每个组件。使用 ,将结果转换arange为 python 列表list(),使其成为ndarray构造函数参数的正确格式。

这一切都取决于你的目的。当你处理数学时。分析,你寻找的可能是一个网格:

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

更多在这里。

编辑:在您发布代码后:正如 DSM 所提到的,np.vectorize这是一个好方法。从文档

class numpy.vectorize(pyfunc, otypes='', doc=None, excluded=None, 
   cache=False)

广义函数类。

定义一个向量化函数,它将对象的嵌套序列或 numpy 数组作为输入,并返回一个 numpy 数组作为输出。向量化函数在输入数组的连续元组上评估 pyfunc,就像 python map 函数一样,除了它使用 numpy 的广播规则。

于 2013-05-12T17:24:49.333 回答