Python 如何将Numpy数组粘贴到Excel

Python 如何将Numpy数组粘贴到Excel,python,excel,numpy,Python,Excel,Numpy,我有多个文件,我使用Numpy和SciPy处理,但我需要提交一个Excel文件。如何有效地将一个巨大的numpy数组复制/粘贴到Excel 我曾尝试转换为Pandas的DataFrame对象,该对象具有非常有用的函数到剪贴板(excel=True),但我花了大部分时间将数组转换为DataFrame 我不能简单地将数组写入CSV文件,然后在excel中打开它,因为我必须将数组添加到现有文件中;使用xlrd/xlwt和其他Excel工具很难实现这一点。我的最佳解决方案是将数组转换为字符串,然后使用w

我有多个文件,我使用Numpy和SciPy处理,但我需要提交一个Excel文件。如何有效地将一个巨大的numpy数组复制/粘贴到Excel

我曾尝试转换为Pandas的DataFrame对象,该对象具有非常有用的函数
到剪贴板(excel=True)
,但我花了大部分时间将数组转换为DataFrame


我不能简单地将数组写入CSV文件,然后在excel中打开它,因为我必须将数组添加到现有文件中;使用xlrd/xlwt和其他Excel工具很难实现这一点。

我的最佳解决方案是将数组转换为字符串,然后使用
win32clipboard
将其发送到剪贴板。这不是一个跨平台的解决方案,但话说回来,Excel并非在所有平台上都可用

Excel使用选项卡(
\t
)标记列更改,并使用
\r\n
指示行更改

有关守则如下:

import win32clipboard as clipboard

def toClipboardForExcel(array):
    """
    Copies an array into a string format acceptable by Excel.
    Columns separated by \t, rows separated by \n
    """
    # Create string from array
    line_strings = []
    for line in array:
        line_strings.append("\t".join(line.astype(str)).replace("\n",""))
    array_string = "\r\n".join(line_strings)

    # Put string into clipboard (open, clear, set, close)
    clipboard.OpenClipboard()
    clipboard.EmptyClipboard()
    clipboard.SetClipboardText(array_string)
    clipboard.CloseClipboard()
我已经用随机数组(100010000)测试了这段代码,最大的瓶颈似乎是将数据传递给函数。(当我在函数开头添加
print
语句时,在它打印任何内容之前,我仍然需要等待一段时间。)


编辑:上一段讲述了我在Visual Studio Python工具方面的经验。在这种环境中,似乎print语句被延迟了。在直接命令行界面中,瓶颈在循环中,正如预期的那样。

您也可以查看project。

如果我需要处理加载到python中的多个文件,然后解析到excel中,我可能会使用


也就是说,我可以提供我的食谱,供任何编辑、投诉或反馈。它不使用第三方库,应该是跨平台的。

从今天起,您也可以使用。它是开源的,与Numpy阵列和熊猫数据帧完全兼容。

我将PhilMacKay的答案扩展到: -包括1维数组和, -要允许逗号作为十进制分隔符(decimal=“,”),请执行以下操作:


我认为这是使用pandas包最简单的方法之一。

将阵列转换为
pandas.DataFrame
,您遇到了哪些问题?它应该像
df=pandas.DataFrame(yourarray)
一样简单。没有问题,只是执行
df=pandas.DataFrame(data=data)
df.to_剪贴板(excel=True)
都需要很长时间。另外,我并不需要列名和行索引.Hm。您把
打印的
声明放在哪里了?在我看来,这似乎很奇怪,因为Python中的函数参数始终只是指针,所以需要花费任何明显的时间。也就是说,您不传递数组的内容,而是传递它的内存地址。您是对的,当我在iPython中尝试此操作时(在
def…
行之后使用
print
),没有延迟。在VisualStudio的Python工具的交互式窗口中尝试此操作时,只有一个。在iPython中,瓶颈在循环处。我将相应地修改我的答案。对我来说,这会将数组中的数字拆分为单个数字、小数点(.)和其他符号(例如
e
)。例如,数组
0.12345e-06
中的值作为
0
1
,…,粘贴到Excel中<代码>e
-
0
6
分成不同的列。是的,看起来很棒。这个产品似乎真的可以提高Excel的可用性和Python的用户基础!但就我目前的目的而言,我不喜欢许可证。。。
import win32clipboard as clipboard

def to_clipboard(array, decimal=","):
    """
    Copies an array into a string format acceptable by Excel.
    Columns separated by \t, rows separated by \n
    """
    # Create string from array
    try:
        n, m = np.shape(array)
    except ValueError:
        n, m = 1, 0
    line_strings = []
    if m > 0:
        for line in array:
            if decimal == ",":
                line_strings.append("\t".join(line.astype(str)).replace(
                    "\n","").replace(".", ","))
            else:
                line_strings.append("\t".join(line.astype(str)).replace(
                    "\n",""))
        array_string = "\r\n".join(line_strings)
    else:
        if decimal == ",":
            array_string = "\r\n".join(array.astype(str)).replace(".", ",")
        else:
            array_string = "\r\n".join(array.astype(str))
    # Put string into clipboard (open, clear, set, close)
    clipboard.OpenClipboard()
    clipboard.EmptyClipboard()
    clipboard.SetClipboardText(array_string)
    clipboard.CloseClipboard()
    import pandas as pd
    pd.DataFrame(arr).to_clipboard()