【问题标题】:Python/Numpy - Save Array with Column AND Row TitlesPython/Numpy - 使用列和行标题保存数组
【发布时间】:2012-04-12 08:21:48
【问题描述】:

我想将二维数组保存到包含行和列“标题”信息的 CSV 文件(如表格)。我知道我可以使用 numpy.savetxt 的 header 参数来保存列名,但是有没有什么简单的方法可以将其他数组(或列表)也包含在数据的第一列(如行标题)?

下面是我目前如何做的一个例子。有没有更好的方法来包含这些行标题,也许是我不知道的 savetxt 技巧?

import csv
import numpy as np

data = np.arange(12).reshape(3,4)
# Add a '' for the first column because the row titles go there...
cols = ['', 'col1', 'col2', 'col3', 'col4']
rows = ['row1', 'row2', 'row3']

with open('test.csv', 'wb') as f:
   writer = csv.writer(f)
   writer.writerow(cols)
   for row_title, data_row in zip(rows, data):
      writer.writerow([row_title] + data_row.tolist())

【问题讨论】:

    标签: python numpy export-to-csv


    【解决方案1】:

    也许你更愿意做这样的事情:

    # Column of row titles
    rows = np.array(['row1', 'row2', 'row3'], dtype='|S20')[:, np.newaxis]
    with open('test.csv', 'w') as f:
        np.savetxt(f, np.hstack((rows, data)), delimiter=', ', fmt='%s')
    

    这会将data 隐式转换为字符串数组,我的计算机中每百万个项目大约需要 200 毫秒。

    dtype '|S20' 表示二十个字符的字符串。如果它太低,你的数字会被砍掉:

    >>> np.asarray([123], dtype='|S2')
    array(['12'], 
      dtype='|S2')
    

    另一种选择,根据我的有限测试,速度较慢,但​​给您更多的控制权并且没有斩波问题,那就是使用np.char.mod,比如

    # Column of row titles
    rows = np.array(['row1', 'row2', 'row3'])[:, np.newaxis]
    str_data = np.char.mod("%10.6f", data)
    with open('test.csv', 'w') as f:
        np.savetxt(f, np.hstack((rows, str_data)), delimiter=', ', fmt='%s')
    

    【讨论】:

    • 虽然使用 hstack 必须在内存中重新创建数组,对吧?因此,如果数据非常大,那么我们必须再次重新分配该内存。对于我的具体应用程序,这不太可能是任何真正的问题,但只是值得一提的一点。而且可能没有任何办法解决这个问题。看起来 savetxt 应该在内部实现,即使它必须执行类似于我的解决方案(但在底层 C 代码中)。
    • 是的,你是对的。我认为也许所有这些开销都可以通过记录数组来避免,并使用 fmt 接受格式化运算符列表的事实,例如fmt=['%s', '%f',...],但我不熟悉它们,所以这只是一个猜测。
    • 是的,我也考虑过记录数组。我认为你是对的,它可以被使用......但我希望避免它们......我想我会选择两个邪恶中较小的那个。
    猜你喜欢
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    相关资源
    最近更新 更多