如何让python的np.savetxt在不同的列中保存循环的每次迭代?

时间:2016-08-24 05:02:57

标签: python python-2.7 numpy for-loop

这是一个非常基本的代码,可以完成我想要的...除了编写文本文件。

import numpy as np

f = open("..\myfile.txt", 'w')
tst = np.random.random(5)
tst2 = tst/3
for i in range(3):
    for j in range(5):
        test = np.random.random(5)+j
        a = np.random.normal(test, tst2)
    np.savetxt(f, np.transpose(a), fmt='%10.2f')
    print a
f.close()

此代码将在.txt文件中写入一个列,该列在for循环的每次迭代后连接。

我想要的是每次迭代的独立列。

如何做到这一点?

注意:我也使用了np.c_[],并且编写列如果我在命令中表达每次迭代。即:np.c_[a[0],a[1]]等等。问题是,如果我的ij值非常大,该怎么办?遵循这种方法是不合理的。

1 个答案:

答案 0 :(得分:1)

所以运行产生:

2218:~/mypy$ python3 stack39114780.py 
[ 4.13312217  4.34823388  4.92073836  4.6214074   4.07212495]
[ 4.39911371  5.15256451  4.97868452  3.97355995  4.96236119]
[ 3.82737975  4.54634489  3.99827574  4.44644041  3.54771411]
2218:~/mypy$ cat myfile.txt
      4.13
      4.35
      4.92
      4.62
      4.07    # end of 1st iteration
      4.40
      5.15
      4.98
      3.97
      ....

你明白发生了什么吗?对savetxt的一次调用会写出一组行。对于像a这样的1d数组,它每行打印一个数字。 (transpose(a)没有做任何事情)。

文件写入是逐行完成的,无法重绕以添加列。因此,要创建多列,您需要创建一个包含多列的数组。然后做一个savetxt。换句话说,在写之前收集所有数据。

在列表中收集您的值,创建一个数组并写下

alist = []
for i in range(3):
    for j in range(5):
        test = np.random.random(5)+j
        a = np.random.normal(test, tst2)
        alist.append(a)
arr = np.array(alist)
print(arr)
np.savetxt('myfile.txt', arr, fmt='%10.2f')

我得到15行5列,但你可以调整它。

2226:~/mypy$ cat myfile.txt
  0.74       0.60       0.29       0.74       0.62
  1.72       1.62       1.12       1.95       1.13
  2.19       2.55       2.72       2.33       2.65
  3.88       3.82       3.63       3.58       3.48
  4.59       4.16       4.05       4.26       4.39

由于arr现在为2d,np.transpose(arr)执行了一些有意义的操作 - 我会获得包含15列的5行。

==================

使用

for i in range(3):
    for j in range(5):
        test = np.random.random(5)+j
        a = np.random.normal(test, tst2)
    np.savetxt(f, np.transpose(a), fmt='%10.2f')

你为每个a写一次i - 因此是3行。你扔掉了j次迭代中的4次。在我的变体中,我收集了所有a,因此获得了15行。