将由不同形状的 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 初学者来说是一项艰巨的工作!