将由不同形状的 numpy 数组组成的 numpy 数组保存到 .txt 文件
Save a numpy array consisting of numpy arrays different shapes to a .txt file
我是 Python 的初学者。这是我正在尝试做的事情:
import numpy as np
r10 = np.array([[i for i in range(0,10)],[i*10 for i in range(0,10)]]).T
r6 = np.array([[i for i in range(0,6)],[i*10 for i in range(0,6)]]).T
r_comb = np.array([[r10],[r6]]).T
np.savetxt('out.txt',r_comb)
使用 np.savetxt 会出现以下错误,因为它仅支持一维数组:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
~\AppData\Local\Programs\Python\Python38-32\lib\site-packages\numpy\lib\npyio.py in savetxt(fname, X, fmt, delimiter, newline, header, footer, comments, encoding)
1433 try:
-> 1434 v = format % tuple(row) + newline
1435 except TypeError:
TypeError: only size-1 arrays can be converted to Python scalars
During handling of the above exception, another exception occurred:
TypeError Traceback (most recent call last)
<ipython-input-88-c3147f076055> in <module>
----> 1 np.savetxt('out.txt',r_comb)
<__array_function__ internals> in savetxt(*args, **kwargs)
~\AppData\Local\Programs\Python\Python38-32\lib\site-packages\numpy\lib\npyio.py in savetxt(fname, X, fmt, delimiter, newline, header, footer, comments, encoding)
1434 v = format % tuple(row) + newline
1435 except TypeError:
-> 1436 raise TypeError("Mismatch between array dtype ('%s') and "
1437 "format specifier ('%s')"
1438 % (str(X.dtype), format))
TypeError: Mismatch between array dtype ('object') and format specifier ('%.18e %.18e')
是否有任何其他方法可以将变量 r_comb 的内容保存到 .txt 文件中,以便我可以将其用于其他绘图程序?
基本上,我希望文本文件看起来像这样:
0 0.0 0 0.0
1 0.1 1 0.1
2 0.2 2 0.2
3 0.3 3 0.3
4 0.4 4 0.4
5 0.5 5 0.5
6 0.6
7 0.7
8 0.8
9 0.9
图像显示了文本文件内容的外观
Hacky 但有效
import numpy as np
r10 = np.array([[i for i in range(0,10)],[i*10 for i in range(0,10)]]).T
r6 = np.array([[i for i in range(0,6)],[i*10 for i in range(0,6)]]).T
# np array with nans
data = np.empty((np.max([r10.shape[0], r6.shape[0]]),4))
data[:] = np.NaN
for i in range(2):
data[0:len(r10[:,i]), i] = r10[:, i]
for i in range(2):
data[0:len(r6[:,i]), i+2] = r6[:, i]
# replace nans and save
data = data.astype(str)
data[data=='nan'] = ''
np.savetxt("out.txt", data, delimiter=" ", fmt="%s")
out.txt
的内容
0.0 0.0 0.0 0.0
1.0 10.0 1.0 10.0
2.0 20.0 2.0 20.0
3.0 30.0 3.0 30.0
4.0 40.0 4.0 40.0
5.0 50.0 5.0 50.0
6.0 60.0
7.0 70.0
8.0 80.0
9.0 90.0
你的r_comb
是一个数组数组:
In [313]: r_comb
Out[313]:
array([[array([[ 0, 0],
[ 1, 10],
[ 2, 20],
[ 3, 30],
[ 4, 40],
[ 5, 50],
[ 6, 60],
[ 7, 70],
[ 8, 80],
[ 9, 90]]),
array([[ 0, 0],
[ 1, 10],
[ 2, 20],
[ 3, 30],
[ 4, 40],
[ 5, 50]])]], dtype=object)
In [314]: _.shape
Out[314]: (1, 2)
savetxt
旨在保存一个漂亮的数字二维数组。默认 fmt
是“%.18e”(阅读文档)。显然那不能格式化数组。
我可以 'flatten' 将其放入一个二维数组中:
In [320]: np.vstack(r_comb[0,:])
Out[320]:
array([[ 0, 0],
[ 1, 10],
[ 2, 20],
[ 3, 30],
[ 4, 40],
....
[ 4, 40],
[ 5, 50]])
并将其写入文件(注意 fmt
中的更改):
In [321]: np.savetxt('test.csv', np.vstack(r_comb[0,:]), fmt='%5d')
In [322]: cat test.csv
0 0
1 10
2 20
3 30
4 40
...
4 40
5 50
您建议的布局不适合示例数组。即使你设法写了它,你打算如何阅读它? numpy
读者期望每行中的列数一致。
0 0.0 0 0.0
1 0.1 1 0.1
2 0.2 2 0.2
3 0.3 3 0.3
4 0.4 4 0.4
5 0.5 5 0.5
6 0.6
7 0.7
8 0.8
9 0.9
你可以在同一个文件上调用savetxt
两次(如果需要可以使用append
模式),然后一个接一个地保存两个数组。通过一些工作,您还可以通过两次调用 genfromtxt
来加载它。但这对于 Python 初学者来说是一项艰巨的工作!
我是 Python 的初学者。这是我正在尝试做的事情:
import numpy as np
r10 = np.array([[i for i in range(0,10)],[i*10 for i in range(0,10)]]).T
r6 = np.array([[i for i in range(0,6)],[i*10 for i in range(0,6)]]).T
r_comb = np.array([[r10],[r6]]).T
np.savetxt('out.txt',r_comb)
使用 np.savetxt 会出现以下错误,因为它仅支持一维数组:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
~\AppData\Local\Programs\Python\Python38-32\lib\site-packages\numpy\lib\npyio.py in savetxt(fname, X, fmt, delimiter, newline, header, footer, comments, encoding)
1433 try:
-> 1434 v = format % tuple(row) + newline
1435 except TypeError:
TypeError: only size-1 arrays can be converted to Python scalars
During handling of the above exception, another exception occurred:
TypeError Traceback (most recent call last)
<ipython-input-88-c3147f076055> in <module>
----> 1 np.savetxt('out.txt',r_comb)
<__array_function__ internals> in savetxt(*args, **kwargs)
~\AppData\Local\Programs\Python\Python38-32\lib\site-packages\numpy\lib\npyio.py in savetxt(fname, X, fmt, delimiter, newline, header, footer, comments, encoding)
1434 v = format % tuple(row) + newline
1435 except TypeError:
-> 1436 raise TypeError("Mismatch between array dtype ('%s') and "
1437 "format specifier ('%s')"
1438 % (str(X.dtype), format))
TypeError: Mismatch between array dtype ('object') and format specifier ('%.18e %.18e')
是否有任何其他方法可以将变量 r_comb 的内容保存到 .txt 文件中,以便我可以将其用于其他绘图程序? 基本上,我希望文本文件看起来像这样:
0 0.0 0 0.0
1 0.1 1 0.1
2 0.2 2 0.2
3 0.3 3 0.3
4 0.4 4 0.4
5 0.5 5 0.5
6 0.6
7 0.7
8 0.8
9 0.9
图像显示了文本文件内容的外观
Hacky 但有效
import numpy as np
r10 = np.array([[i for i in range(0,10)],[i*10 for i in range(0,10)]]).T
r6 = np.array([[i for i in range(0,6)],[i*10 for i in range(0,6)]]).T
# np array with nans
data = np.empty((np.max([r10.shape[0], r6.shape[0]]),4))
data[:] = np.NaN
for i in range(2):
data[0:len(r10[:,i]), i] = r10[:, i]
for i in range(2):
data[0:len(r6[:,i]), i+2] = r6[:, i]
# replace nans and save
data = data.astype(str)
data[data=='nan'] = ''
np.savetxt("out.txt", data, delimiter=" ", fmt="%s")
out.txt
0.0 0.0 0.0 0.0
1.0 10.0 1.0 10.0
2.0 20.0 2.0 20.0
3.0 30.0 3.0 30.0
4.0 40.0 4.0 40.0
5.0 50.0 5.0 50.0
6.0 60.0
7.0 70.0
8.0 80.0
9.0 90.0
你的r_comb
是一个数组数组:
In [313]: r_comb
Out[313]:
array([[array([[ 0, 0],
[ 1, 10],
[ 2, 20],
[ 3, 30],
[ 4, 40],
[ 5, 50],
[ 6, 60],
[ 7, 70],
[ 8, 80],
[ 9, 90]]),
array([[ 0, 0],
[ 1, 10],
[ 2, 20],
[ 3, 30],
[ 4, 40],
[ 5, 50]])]], dtype=object)
In [314]: _.shape
Out[314]: (1, 2)
savetxt
旨在保存一个漂亮的数字二维数组。默认 fmt
是“%.18e”(阅读文档)。显然那不能格式化数组。
我可以 'flatten' 将其放入一个二维数组中:
In [320]: np.vstack(r_comb[0,:])
Out[320]:
array([[ 0, 0],
[ 1, 10],
[ 2, 20],
[ 3, 30],
[ 4, 40],
....
[ 4, 40],
[ 5, 50]])
并将其写入文件(注意 fmt
中的更改):
In [321]: np.savetxt('test.csv', np.vstack(r_comb[0,:]), fmt='%5d')
In [322]: cat test.csv
0 0
1 10
2 20
3 30
4 40
...
4 40
5 50
您建议的布局不适合示例数组。即使你设法写了它,你打算如何阅读它? numpy
读者期望每行中的列数一致。
0 0.0 0 0.0
1 0.1 1 0.1
2 0.2 2 0.2
3 0.3 3 0.3
4 0.4 4 0.4
5 0.5 5 0.5
6 0.6
7 0.7
8 0.8
9 0.9
你可以在同一个文件上调用savetxt
两次(如果需要可以使用append
模式),然后一个接一个地保存两个数组。通过一些工作,您还可以通过两次调用 genfromtxt
来加载它。但这对于 Python 初学者来说是一项艰巨的工作!