将多个数组一起添加到python中形成一个数组

时间:2014-12-11 23:28:24

标签: python arrays list arraylist

我有一个列表(称为ys)的三个列表(ys [0],ys [1],ys [2])。三个列表中的每一个都包含10个长度为1534的数组。第一个列表如下所示:

In [57]: print ys[0]
[array([ 1655.13816505,  1547.98589715,   572.2745519 , ...,    89.10781318,
      93.89836665,    95.07931966]), array([ 1222.2549591 ,   375.13612313,  1117.62684517, ...,    92.01444874,
      96.37158146,    98.09804547]), array([ 405.61715294,  347.45411   ,  458.31631866, ...,   95.87440348,
     92.59379305,   96.88934008]), array([  958.5300296 ,   690.68863703,  1315.69537196, ...,    96.02464434,
      94.58280479,    93.77347022]), array([ 276.97463055,  457.34617477,  908.78859867, ...,   94.75916652,
     94.02373941,   94.15538106]), array([ 1822.50632297,   596.38771818,  1163.05119636, ...,    90.92428715,
      97.46551579,    90.34230747]), array([ 1609.11576638,  1343.19751488,   891.16993616, ...,    94.081789  ,
      91.84201144,    94.06961381]), array([ 1481.02653876,   843.39342494,  1208.37885821, ...,    95.86349883,
      95.93122661,    92.94565202]), array([ 1330.1940189 ,   844.70910408,  1151.75233836, ...,    98.82465514,
     100.37876234,    96.15178672]), array([ 1287.56325832,   365.89812057,  1034.15108853, ...,    90.64446465,
      94.99436954,    90.88272168])]

我想找到一种方法来逐元素地对这些数组进行求和,这样我就得到一个长度为1534的数组。生成三个列表列表的代码摘录如下:

def ys(norm2, ell_T):
    t=[]
    e=[]
    b=[]
    T=norm2[0]
    E=norm2[1]
    B=norm2[2]
    for i in range (0, len(T)):
        yt=((ell_T * (ell_T+1) * T[i])/(2*pi))
        ye=((ell_T * (ell_T+1) * E[i])/(2*pi))
        yb=((ell_T * (ell_T+1) * B[i])/(2*pi))
        t.append(yt)
        e.append(ye)
        b.append(yb)
    return t, e, b

ys=ys(norm2, ell_T)

我对求和的尝试以及随后的平均值(不起作用)如下所示:

def averageys(ys, theory):
    t=[]
    e=[]
    b=[]
    for i in range(1, len(ys[0])):
        yst_arrays=ys[0][i]
        yse_arrays=ys[1][i]
        ysb_arrays=ys[2][i]
        sumT=np.add(yst_arrays)
        sumE=np.add(yse_arrays)
        sumB=np.add(ysb_arrays)
        avt=sumT/len(ys[0])
        ave=sumE/len(ys[0])
        avb=sumB/len(ys[0])
        t.append(avt)
        e.append(ave)
        b.append(avb)
    return t, e, b

averageys=averageys(ys, theory)

问题似乎是np.add函数。它们需要输入,如np.add(ys [0] [0],ys [0] [1]等等)但是我想概括它,所以它不固定为10个数组。

5 个答案:

答案 0 :(得分:2)

您是否尝试将numpy数组列表(y)转换为一个 numpy数组,然后在其中一个轴上求和?当你处理(很多)数值数据时,使用numpy数组比普通的python结构(列表和各种列表推导或函数结构,如map)有很多优点。

由于您的代码不是最小的工作示例,我将使用更少数组的不同示例:

>>> f0 = [np.random.random_integers(0, 10, (3,)) for _ in range(2)]    
>>> f1 = [np.random.random_integers(0, 10, (3,)) for _ in range(2)]    
>>> f2 = [np.random.random_integers(0, 10, (3,)) for _ in range(2)]    
>>> y = [f0, f1, f2]    
>>> y 
[[array([7, 8, 3]), array([ 7, 10,  0])],
 [array([2, 7, 8]), array([2, 6, 7])],
 [array([3, 5, 0]), array([7, 3, 6])]]
>>> y[0]  # it's a list of 2 numpy arrays, similar to your example
[array([7, 8, 3]), array([ 7, 10,  0])]
>>> arr = np.array(y)  # conversion of list of lists of arrays to one numpy array
>>> arr  # it is now an array with 3 axes. Its shape is (3, 2, 3)
array([[[ 7,  8,  3],
        [ 7, 10,  0]],

       [[ 2,  7,  8],
        [ 2,  6,  7]],

       [[ 3,  5,  0],
        [ 7,  3,  6]]])

要仅对f0,f1和f2中存在的数组求和,您可以:

>>> arr.sum(axis=1) 
array([[14, 18,  3],
       [ 4, 13, 15],
       [10,  8,  6]])

要总结f0,f1和f2(全部在一起),您可以将前一个数组的总和超过axis=0

>>> f = arr.reshape(3*2, 3); f 
array([[ 7,  8,  3],
       [ 7, 10,  0],
       [ 2,  7,  8],
       [ 2,  6,  7],
       [ 3,  5,  0],
       [ 7,  3,  6]])

>>> f.sum(axis=0)  # take the sum over all rows
array([28, 39, 24])

一旦你总结了所有这些,你可以通过除以你总和的行数来计算平均值。对于第一个场景(仅分别对f0,f1和f2求和),你甚至可以说arr.mean(axis=1),它会给你:

>>> arr.mean(axis=1)
array([[ 7. ,  9. ,  1.5],
       [ 2. ,  6.5,  7.5],
       [ 5. ,  4. ,  3. ]])

您可以通过上述示例轻松验证。

答案 1 :(得分:1)

如果我正确理解,你想要对例如数组进行求和。是[0]在一起?因此,我做了一个虚拟的例子,大量模拟你的案例

import numpy as np

ys = [[np.array([1,1,1]), np.array([1,1,1])]*5,   # 10 array of length 3 instead 1534
      [np.array([2, 2,2]), np.array([2,2,2])]*5,  # 10 array of length 3 instead 1534
      [np.array([3, 3,3]), np.array([3,3,3])]*5]  # 10 array of length 3 instead 1534 

因此,您可以简单地通过以下方式对它们进行求和:

print(list(map(sum, ys)))

这导致:

[array([10, 10, 10]), array([20, 20, 20]), array([30, 30, 30])]

如果你想总结所有这些:

print(sum(list(map(sum, ys))))
# gives: [60 60 60]

答案 2 :(得分:1)

您可以一次总结各个数组的步骤:

# Sums up the 10 arrays in each of the 3 lists
reduced_ys = [[sum(value) for value in zip(*ys_list)] for ys_list in zip(*ys)]

# Sums up the 3 remaining lists
final_ys = [sum(ys_list) for ys_list in zip(*reduced_ys)]

此处的语法也可以在问题Merging/adding lists in Python中看到。

答案 3 :(得分:0)

这是您的解决方案。

def averageys(ys):
    return list(map(sum, (list(map(sum, ys)))))

答案 4 :(得分:0)

如果您只想概括和修复您的功能:

def averageys(ys, theory):
    # seperate the three groups of data
    yst, yse, ysb = ys

    # number of items in the sum
    # assumes len(yst)==len(yse)==len(ysb)
    # n needs to be a float for the mean to work
    n = float(len(yst))

    # element-wise sum of each item in the sublists
    # the * operator preceding the argument will unpack each item in the sublist
    sumT=np.add(*yst)
    sumE=np.add(*yse)
    sumB=np.add(*ysb)

    avt=sumT/n
    ave=sumE/n
    avb=sumB/n
    return avt, ave, avb

但是:请参阅Oliver W.'s answer了解正确的方法。