我有一个基本上返回generalized harmonic number的函数。
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]])
答案 0 :(得分: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]])
答案 1 :(得分:0)
arange
在[1,limit+1]
范围内生成均匀间隔的1D ndarray。
现在假设你想要一个均匀间隔阵列的多暗点阵。然后,您可以使用arange
生成2D ndarray的每个组件。您将arange
的结果转换为带有list()
的python列表,以使其成为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
是一个很好的方法。 From doc,
class numpy.vectorize(pyfunc, otypes='', doc=None, excluded=None,
cache=False)
广义函数类。
定义一个矢量化函数,该函数采用嵌套的对象序列 或numpy数组作为输入并返回一个numpy数组作为输出。该 向量化函数在连续的元组上计算pyfunc 输入数组,如python map函数,除了它使用 广播规则numpy。