【问题标题】:Save a numpy array consisting of numpy arrays different shapes to a .txt file将由不同形状的 numpy 数组组成的 numpy 数组保存到 .txt 文件中
【发布时间】:2020-07-05 19:55:32
【问题描述】:

我是 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

显示文本文件内容的图像

【问题讨论】:

  • 你不能这样做(只需拨打savetxt)。结果会更难阅读!

标签: python arrays python-3.x numpy saving-data


【解决方案1】:

哈克但有效

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

【讨论】:

    【解决方案2】:

    您的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'(阅读文档)。显然不能格式化数组。

    我可以将其“展平”为一个二维数组:

    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 初学者来说是很多工作!

    【讨论】:

    • 我真的不需要使用 NumPy 再次读取文本文件。我只是使用文本文件来使用 XmGrace 等程序绘制我的数据。这个问题是我正在从事的一个更大项目的一部分。基本上,我以二进制文件的形式获取光谱数据,我将其读入 numpy 数组并将其用于使用 python 进行绘图和其他一些数据分析。我只需要稍后使用 Python 以外的东西绘制文本文件。
    • 写入一个数组。然后附加第二个。
    猜你喜欢
    • 2018-12-15
    • 1970-01-01
    • 2012-03-22
    • 2018-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 2017-03-12
    相关资源
    最近更新 更多