【问题标题】:Write 1D numpy arrays to csv file row by row将一维 numpy 数组逐行写入 csv 文件
【发布时间】:2018-07-09 21:34:34
【问题描述】:

我正在尝试获取多个 csv 文件(15 x 15 矩阵),将它们展平为一维矩阵,然后使用 python 将它们逐行写入新的 csv 文件。

输入 csv 文件的示例:

0,1,1,1,1,1,1,1,1,0,0,0,0,0,0
0,0,1,0,0,0,0,0,1,0,0,0,0,0,0
....
....

这是我目前使用的方法:

import pandas as pd
import glob
import numpy as np

path = r'.../Model_AMs'

allFiles = glob.glob(path + "/*.csv")

for file_ in allFiles:
    df = pd.read_csv(file_, header=None).values.flatten()

    np.savetxt('trainingdata.csv', df, newline=" ", delimiter=',')

但是,当我打开 trainingdata.csv 时,它看起来像这样:

0.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00

它不是用','来分隔元素,而且还添加了很多0,而不是简单地将值保持为1或0。

任何帮助将不胜感激。谢谢

【问题讨论】:

  • 数字的格式可以使用关键字参数fmt(具体使用方法见docs.scipy.org/doc/numpy-1.13.0/reference/generated/…docs.python.org/3/library/…
  • 我看到了,但不确定它是否适合使用。在文档中,相同的 fmt 用于“str 或 strs 序列”。我试图保持二进制格式(我相信这是整数?)
  • 如果您将所有值收集到一个二维数组中并通过一个savetxt 调用将其写入会更好。当前,您的循环正在覆盖以前的保存。您可以保存一维数组,但使用二维数组(行 = 行;列 = 列)更容易控制布局。默认fmt 是一般科学浮点数。
  • 当我按照@hpaulj 的建议使用二维数组时,我无法重现缺少逗号的问题,但是当我覆盖这些行时,我也没有逗号。

标签: python arrays csv numpy


【解决方案1】:

此时您正在将一行写入文件(并覆盖之前的行)。正如@hpaulj 在 cmets 中指出的那样,您可以考虑使用二维数组。

以下是 2D 案例的示例:

import numpy as np

df = np.arange(15*15)
df = df.reshape(15,15)
print df

np.savetxt('trainingdata.csv', df, fmt='%i', newline=" ", delimiter=',')

fmt 参数将值格式化为您希望的整数。 如果你真的想覆盖之前的行或使用一维数组,否则可以保存如下:

import numpy as np

df = np.arange(15*15)
df = df.reshape(15,15)


for i in range(15):
    np.savetxt('trainingdata2.csv', [df[i]], fmt='%i', newline=" ", delimiter=',')

注意[df[i]],它在将一维数组写入文件之前有效地创建了一个二维数组。这可以防止您描述的逗号问题。这样做的原因是,通过使用[df[i]],您告诉np.savetxt 您想要1 行15 列。如果您输入一个包含 15 个元素的简单一维数组,它将被解释为 15 行,每行 1 列。您没有意识到这一点,因为您设置了 newline = ' ' 的值,这导致它们位于文件的同一行,尽管它们实际上是由空格分隔的多个“行”。

【讨论】:

    【解决方案2】:

    2d 数组方法更简洁,但这里有一种仅使用 pandas 的方法:

    import pandas as pd
    import glob
    
    path = r'.../Model_AMs'
    
    allFiles = glob.glob(path + "/*.csv")
    
    for file_ in allFiles:
    
        # transpose() is here to order values in same way as 
        # numpy's flatten(). astype() shouldn't be necessary,
        # but useful just in case pandas finds some floating
        # point values in your data
        df = pd.read_csv(file_, header=None).astype(int).transpose().melt()
    
        # writing in append mode
        pd.DataFrame(dict(zip(df.index, df.value)), index=[0]).to_csv(
          'trainingdata.csv', index=False, header=False, mode='a')
    

    【讨论】:

      猜你喜欢
      • 2016-09-27
      • 2015-08-07
      • 2023-03-31
      • 2019-01-29
      • 2018-03-08
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多