这是一个非常基本的代码,可以完成我想要的...除了编写文本文件。
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]]
等等。问题是,如果我的i
和j
值非常大,该怎么办?遵循这种方法是不合理的。
答案 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行。