我想使用函数用值填充numpy数组。我希望数组以一个初始值开始并填充到给定长度,使用数组中的每个先前值作为函数的输入。
每个数组值i应为(i-1)* x **(y / z)。
经过一番工作后,我必须:
import numpy as np
f = np.zeros([31,1])
f[0] = 20
fun = lambda i, j: i*2**(1/3)
f[1:] = np.fromfunction(np.vectorize(fun), (len(f)-1,1), dtype = int)
这用
填充数组[firstvalue = 20,0,i-1 + 1 * 2 **(1/3),...]
我已经到过这里阅读
https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.fromfunction.html
Most efficient way to map function over numpy array
Fastest way to populate a matrix with a function on pairs of elements in two numpy vectors?
How do I create a numpy array using a function?
但我还没有得到如何将其翻译成我的功能。
答案 0 :(得分:0)
除了最初的20,它产生相同的值
np.arange(31)*2**(1/3)
您的迭代版本(稍加修改)
def foo0(n):
f = np.zeros(n)
f[0] = 20
for i in range(1,n):
f[i] = f[i-1]*2**(1/3)
return f
替代方案:
def foo1(n):
g = [20]
for i in range(n-1):
g.append(g[-1]*2**(1/3))
return np.array(g)
他们生产同样的东西:
In [25]: np.allclose(foo0(31), foo1(31))
Out[25]: True
我的速度有点快:
In [26]: timeit foo0(100)
35 µs ± 75 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [27]: timeit foo1(100)
23.6 µs ± 83.6 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
但我们不需要每次评估2**(1/3)
def foo2(n):
g = [20]
const = 2**(1/3)
for i in range(n-1):
g.append(g[-1]*const)
return np.array(g)
节省了很少的时间。但是,这只是将每个条目乘以相同的const。因此,我们可以使用cumprod
来节省更多时间:
def foo3(n):
g = np.ones(n)*(2**(1/3))
g[0]=20
return np.cumprod(g)
In [37]: timeit foo3(31)
14.9 µs ± 14.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [40]: np.allclose(foo0(31), foo3(31))
Out[40]: True