Python3:处理numpy数组并通过openpyxl导出

Python3:处理numpy数组并通过openpyxl导出,numpy,python-3.5,openpyxl,Numpy,Python 3.5,Openpyxl,我正在使用由多个列表组成的数组。对于每个子列表,我想取平均值和标准偏差,并将它们写在excel表格中 我的代码完成了它的工作,但它让我头疼,因为我觉得我根本没有有效地使用python,特别是在步骤(2)中,我以一步一步的方式使用numpy。此外,我不明白为什么我必须在步骤(3)中进行修改,以便将数据(“total”)以一种可以提供给openpyxl编写器(“total_列表”)的形式呈现出来。如果您能帮助我使其更加优雅,我将不胜感激,以下是我的代码: import numpy as np fro

我正在使用由多个列表组成的数组。对于每个子列表,我想取平均值和标准偏差,并将它们写在excel表格中

我的代码完成了它的工作,但它让我头疼,因为我觉得我根本没有有效地使用python,特别是在步骤(2)中,我以一步一步的方式使用numpy。此外,我不明白为什么我必须在步骤(3)中进行修改,以便将数据(“total”)以一种可以提供给openpyxl编写器(“total_列表”)的形式呈现出来。如果您能帮助我使其更加优雅,我将不胜感激,以下是我的代码:

import numpy as np
from openpyxl import Workbook
from itertools import chain

# (1) Make up sample array:
arr = [[1,1,3], [3,4,2], [4,4,5], [6,6,5]]

# (2) Make up lists containing average values and std. deviations
avg = []
dev = []

for i in arr:
    avg.append(np.mean(i))
    dev.append(np.std(i))

# (3) Make an alternating list (avg 1, dev 1, avg 2, dev 2, ...)
total = chain.from_iterable( zip( avg, dev ) )

# (4) Make an alternative list that can be fed to the xlsx writer
total_list = []
for i in total:
    total_list.append(i)

# Write to Excel file
wb = Workbook()
ws = wb.active

ws.append(total_list)
wb.save("temp.xlsx")

我想有格式显示在图片附件。重要的是,所有数据都在一行中

我会使用Pandas模块,因为它可以非常轻松地完成所有提到的任务:

import pandas as pd

df = pd.DataFrame(arr)

In [250]: df
Out[250]:
   0  1  2
0  1  1  3
1  3  4  2
2  4  4  5
3  6  6  5

In [251]: df.T
Out[251]:
   0  1  2  3
0  1  3  4  6
1  1  4  4  6
2  3  2  5  5

In [252]: df.T.mean()
Out[252]:
0    1.666667
1    3.000000
2    4.333333
3    5.666667
dtype: float64

In [253]: df.T.std(ddof=0)
Out[253]:
0    0.942809
1    0.816497
2    0.471405
3    0.471405
dtype: float64
您还可以轻松地将数据框保存为Excel文件:

df.to_excel(r'/path/to/file.xlsx', index=False)
总共:

In [260]: df['avg'] = df.mean(axis=1)

In [261]: df['dev'] = df.std(axis=1, ddof=0)

In [262]: df
Out[262]:
   0  1  2       avg       dev
0  1  1  3  1.666667  0.816497
1  3  4  2  3.000000  0.707107
2  4  4  5  4.333333  0.408248
3  6  6  5  5.666667  0.408248

In [263]: df.to_excel('d:/temp/result.xlsx', index=False)
result.xlsx:


numpy代码的改进:

In [272]: arr = [[1,1,3], [3,4,2], [4,4,5], [6,6,5]]
从这个列表中创建一个数组。这不是必需的,因为
np.mean
是在幕后进行的,但它应该有助于将动作可视化

In [273]: arr = np.array(arr)
In [274]: arr
Out[274]: 
array([[1, 1, 3],
       [3, 4, 2],
       [4, 4, 5],
       [6, 6, 5]])
现在计算整个阵列的平均值和标准差;使用
axis=1
对行进行操作。因此,您不需要迭代
arr
的子列表

In [277]: m=np.mean(arr, axis=1)
In [278]: s=np.std(arr, axis=1)
In [279]: m
Out[279]: array([ 1.66666667,  3.        ,  4.33333333,  5.66666667])
In [280]: s
Out[280]: array([ 0.94280904,  0.81649658,  0.47140452,  0.47140452])
有多种方法可以将这两个阵列转换为交错阵列。一种是垂直堆叠,然后转置。这是列表
zip(*…)
技巧的
numpy
答案

In [281]: data=np.vstack([m,s])
In [282]: data
Out[282]: 
array([[ 1.66666667,  3.        ,  4.33333333,  5.66666667],
       [ 0.94280904,  0.81649658,  0.47140452,  0.47140452]])
In [283]: data=data.T.ravel()
In [284]: data
Out[284]: 
array([ 1.66666667,  0.94280904,  3.        ,  0.81649658,  4.33333333,
        0.47140452,  5.66666667,  0.47140452])
我没有
openpyxl',但可以用
savetxt`写csv:

In [296]: np.savetxt('test.txt',[data],fmt='%f', delimiter=',',header='#mean1 std1 ...')
In [297]: cat test.txt

# #mean1 std1 ...
1.666667,0.942809,3.000000,0.816497,4.333333,0.471405,5.666667,0.471405

我使用了
[数据]
,因为
数据
的计算值是1d,而
savetxt
会将其保存为一列。它在数据的“行”上迭代。

您能发布所需的数据集吗?您希望使用哪种形状?当您尝试这样做时,您遇到了哪些问题?openpyxl支持numpy类型。FWIW openpyxl现在可以处理数据帧对象,这让用户对输出有更多的控制权。@CharlechLark,你能分享一些新功能的链接吗(示例)?