numpy数组fromfunction使用每个先前的值作为输入,具有非零的初始值

时间:2018-03-22 16:56:24

标签: python arrays function numpy

我想使用函数用值填充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

Use of numpy fromfunction

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?

但我还没有得到如何将其翻译成我的功能。

1 个答案:

答案 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