将1D numpy数组逐行写入csv文件

时间:2018-01-30 21:36:08

标签: python arrays csv numpy

我正在尝试获取多个csv文件(15 x 15矩阵),将它们展平为1D矩阵,然后使用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。

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

2 个答案:

答案 0 :(得分:1)

此时您正在将一行写入您的文件(并通过之前覆盖该行)。正如@hpaulj在评论中指出的那样,你可以考虑使用2D数组。

以下是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]]在将1D数组写入文件之前有效地生成1D数组的2D数组。这可以防止您描述的逗号问题。原因是,通过使用[df[i]],您告诉np.savetxt您希望1行包含15列。如果输入包含15个元素的简单1D数组,则会将其解释为15行,每行1列。您没有意识到这一点,因为您设置newline = ' '的值会导致它们位于文件的同一行,尽管它们实际上是由空格分隔的多个“行”。

答案 1 :(得分:0)

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')