numpy.savetxt将数组保存到文件中的特定位置?

时间:2015-08-18 20:58:08

标签: python arrays numpy

我有一个file.txt形式:

; In this topology include file, you will find position restraint
; entries for all the heavy atoms in your original pdb file.
; This means that all the protons which were added by pdb2gmx are
; not restrained.

[ position_restraints ]
; atom  type      fx      fy      fz
     1     1  1000  1000  1000
     5     1  1000  1000  1000
     7     1  1000  1000  1000
    10     1  1000  1000  1000
    12     1  1000  1000  1000
    13     1  1000  1000  1000
    14     1  1000  1000  1000
    16     1  1000  1000  1000

(如果您感兴趣,这是来自gromacs)的位置限制文件

在Python中,我有一个numpy.array的整数[2, 4, 7, 8, 9, 10, 15, 108]。我想将file.txt替换为:

; In this topology include file, you will find position restraint
; entries for all the heavy atoms in your original pdb file.
; This means that all the protons which were added by pdb2gmx are
; not restrained.

[ position_restraints ]
; atom  type      fx      fy      fz
     2     1  1000  1000  1000
     4     1  1000  1000  1000
     7     1  1000  1000  1000
     8     1  1000  1000  1000
     9     1  1000  1000  1000
    10     1  1000  1000  1000
    15     1  1000  1000  1000
   108     1  1000  1000  1000

也就是说,file.txt中的表的第一列将被我在Python中定义的整数数组所取代。请注意如何遵守列中的对齐方式。这很重要。

我该怎么做?我在问题标题中使用numpy.savetxt,因为它与我想要做的很接近,但我认为numpy.savetxt本身并不能做到。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

您应该可以使用savetxt和各种参数重新创建此输出。

需要headercomments。我尝试使用多行标题和comments=';',看看是否重现了文件标题。

fmt控制数据的布局。您可以指定一列,它将为所有列复制,或者您可以指定所有列。看看文档并玩转。

至于数据,我从原始文件加载它,得到一个2d数组(它是全部整数)。然后用新数字替换第1列。并将其传递给您的savetxt

大致是:

arr = loadtxt('oldfile', etc)
arr[:,0] = newcolumn
np.savetxt('newfile', arr, header..., )

标题的另一种方法是从原始行读取相应的行,并将它们写入新文件。然后将文件保持打开状态,将其句柄传递给savetxtsavetxt采用文件名或已打开文件的句柄。因此,它可以将材料添加到现有文件中。

如果你不能写自己的文件。 savetxt没有做任何神秘的事情。它就在python代码中。编写数据的核心步骤是:

 for row in X:
    fh.write(asbytes(format % tuple(row) + newline))

换句话说,它逐行逐行写入2d数组。 format源自您的输入fmt参数。

 format % tuple(row)

是正常的Python字符串格式,使用输入数组中一行的数据。尝试使用fmt,直到获得正确的列布局。