我有一个列表(称为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个数组。
答案 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了解正确的方法。