如何创建一个Nx1维数组,其中每个元素是另一个数组的函数?

时间:2011-12-14 20:03:02

标签: python

import math as m
import numpy as np
i = np.mgrid[1:21:1]
N = [1,1,0]
def G1(i):
    H1 = i**2
    H2 = 2*H1
    return H2
def G2(i):
    H1 = i**3
    H2 = 3*H1
    return H2
def G3(i):
    H1 = i**4
    H2 = 4*H1
    return H2
Gc = []
for a in xrange(1,21):
    K1 = [G1(i)[i[a]], G2(i)[i[a]], G3(i)[i[a]]]
    K2 = np.multiply(N,K1)
    K3 = m.fsum(K2)
    Gc.extend(K3)

返回错误:

  

TypeError:'float'对象不可迭代

我只想创建一个与Gc大小相同的i数组,其中每个元素都是i的函数。

3 个答案:

答案 0 :(得分:1)

你的问题很模糊。如果不了解理解的细节并提出解决方案,我会尝试解决我在代码中看到的问题

  1. K3不是列表而是标量。您无法通过extend方法将其传递给列表。你可能想要Gc.extend([K3])
  2. 之类的东西
  3. 即使你解决了(1),你也会得到语句K1 = [G1(i)[i[a]], G2(i)[i[a]], G3(i)[i[a]]]的IndexError。当a = 19时,i[a]将为'20',但i的长度和G(i)为20.所以你还需要适当地纠正它。
  4. 编辑* * *在尝试从您的程序和结语语句中理解后,我提出了这个解决方案

    for a in xrange(0,20):
        GCArray=[G1,G2,G3]    #Array of Functions
        # You can also do [g(i[a]) for g in [G1,G2,G3]]
        K1 = [g(i[a]) for g in GCArray] #Apply ath i to all the functions
        K2 = np.multiply(N,K1) #Rest Similar to yours
        K3 = m.fsum(K2)
        Gc.extend([K3])
    

答案 1 :(得分:0)

Gc.extend(K3)会返回float,而非listGc.extend需要list,而不是float。您最有可能想要使用Gc.append(K3),因为它需要标量而不是list

答案 2 :(得分:0)

您可以使用map功能(内置)或列表理解来执行此操作。

例如,假设您要将函数foo()应用于整个项目列表(i),您可以编写:

Gc = map(foo,i)

Gc = [foo(x) for x in i]

这将为您提供一个列表Gc,如下所示:

[foo(i[1]), foo(i[2]), ... , foo(i[n])]

这两种方法都可以用于多个参数的函数,即:

def foo(a,b):
    return a*b**a
Gc = map(foo,i,q) # i and q are lists of equal length

Gc = [foo(i,x) for i,x in enumerate(i)]