Python 使用numpy将列拆分为两列
我有一个包含11列的文本文件,我用Python 使用numpy将列拆分为两列,python,numpy,Python,Numpy,我有一个包含11列的文本文件,我用np.genfromtxt打开了它 第三栏如下所示 The Column +220.18094-0.28421 +58.24577+0.08044 +58.24498+0.08177 +58.24552+0.08175 +86.55739-0.04768 +179.60575-0.34409 +86.55622-0.04726 +86.55649-0.04723 +86.55548-0.04718 +86.55879-0.04705 +86.55696-0
np.genfromtxt
打开了它
第三栏如下所示
The Column
+220.18094-0.28421
+58.24577+0.08044
+58.24498+0.08177
+58.24552+0.08175
+86.55739-0.04768
+179.60575-0.34409
+86.55622-0.04726
+86.55649-0.04723
+86.55548-0.04718
+86.55879-0.04705
+86.55696-0.04685
+43.95906+0.14121
+356.95494+0.21770
+356.95594+0.21763
我只想将这一列保存到新文本文件中,然后将该列拆分为两列,如下所示
The Column
+220.18094-0.28421
+58.24577+0.08044
+58.24498+0.08177
+58.24552+0.08175
+86.55739-0.04768
+179.60575-0.34409
+86.55622-0.04726
+86.55649-0.04723
+86.55548-0.04718
+86.55879-0.04705
+86.55696-0.04685
+43.95906+0.14121
+356.95494+0.21770
+356.95594+0.21763
Txt文件:
+220.18094 -0.28421
+58.24577 +0.08044
+58.24498 +0.08177
+58.24552 +0.08175
+86.55739 -0.04768
+179.60575 -0.34409
+86.55622 -0.04726
+86.55649 -0.04723
+86.55548 -0.04718
+86.55879 -0.04705
+86.55696 -0.04685
+43.95906 +0.14121
+356.95494 +0.21770
+356.95594 +0.21763
如何执行此操作?假设您已将这两列数据作为字符串列表读取,请使用
re
将字符串拆分为数字:
In [479]: d
Out[479]:
['+220.18094-0.28421',
'+58.24577+0.08044',
'+58.24498+0.08177',
'+58.24552+0.08175',
'+86.55739-0.04768',
'+179.60575-0.34409',
'+86.55622-0.04726',
'+86.55649-0.04723',
'+86.55548-0.04718',
'+86.55879-0.04705',
'+86.55696-0.04685',
'+43.95906+0.14121',
'+356.95494+0.21770',
'+356.95594+0.21763']
In [480]: import re
...: [map(float, re.findall('[-+][^-+]*', i)) for i in d]
Out[480]:
[[220.18094, -0.28421],
[58.24577, 0.08044],
[58.24498, 0.08177],
[58.24552, 0.08175],
[86.55739, -0.04768],
[179.60575, -0.34409],
[86.55622, -0.04726],
[86.55649, -0.04723],
[86.55548, -0.04718],
[86.55879, -0.04705],
[86.55696, -0.04685],
[43.95906, 0.14121],
[356.95494, 0.2177],
[356.95594, 0.21763]]
编辑:
当我将列定义为d=data[:,2]d给定数组([nan,nan,nan,…,nan,nan,nan])时,为什么?
您的文件可能包含数字和字符串,请使用np.genfromtxt(fname,dtype=object)
并将其打印出来,以检查您是否成功读取
def edit_file():
f = open('file.txt', 'r')
lines = f.readlines()
f.close()
f1 = open('file.txt', 'w')
for line in lines:
line = line.replace('+',' +')
line = line.replace('-',' -')
f1.write(line)
f1.close()
file.txt:
+220.18094 -0.28421
+58.24577 +0.08044
+58.24498 +0.08177
+58.24552 +0.08175
+86.55739 -0.04768
+179.60575 -0.34409
+86.55622 -0.04726
+86.55649 -0.04723
+86.55548 -0.04718
+86.55879 -0.04705
+86.55696 -0.04685
+43.95906 +0.14121
+356.95494 +0.21770
+356.95594 +0.21763
如果愿意,可以使用“replace()”以简单的方式完成此操作 要仅读取第三列,请执行以下操作:
d = np.genfromtxt('yourfile.txt',usecols=(2),dtype=None)
要拆分并转换为浮动,可以执行以下操作:
g = np.array([re.split(' ',y.replace('-',' -')) for y in [x.replace('+',' ') for x in d]],dtype=float)
并保存到文件:
np.savetxt('yournewfile.txt',g)
2021年的答案
自从最初提出这个问题以来,七年来情况发生了变化,以前的答案似乎并没有真正回答这个问题的定义。我最近遇到了这个问题,在发现这个未完全回答的问题后找到了解决方案。如果其他人在尝试做同样的事情时偶然发现这个问题,我希望这个解决方案能让他们重新行动起来
问题
最初的问题是使用numpy的genfromtxt
函数加载11列。第三列应拆分并以固定列格式保存到单独的文件中
问题的正确答案将显示如何获取该特定列,将其拆分,然后以正确的格式将其写入单独的文件。我们使用的方法可以处理numpy数组中的任何列,因此此解决方案可以非常容易地应用于其他问题
解决方案
我就是这样做的。如果有更有效的方法,请在下面进行评论
1.导入库
我们正在和numpy合作,所以我们需要导入它
import numpy as np
我们还将使用re
拆分列中的字符串,因此也将其导入
import re
2.读取数据
首先,我们将根据需要使用genfromtxt
阅读。问题没有说明使用了哪些参数,因此我们将依赖于许多默认值
d = np.genfromtxt('data.csv', dtype=str, delimiter=',', skip_header=1, encoding='UTF-8')
在这一行中,我们正在加载一个data.csv
,它具有逗号分隔的字符串值、一个标题行以及UTF-8
中编码的所有内容。您会注意到dtype
被显式设置为str
。这很重要。如果使用None
,数组的结构将不同,下面的代码将失败,因此请确保使用dtype=str
3.第三纵队
这里是棘手的部分。我们需要取出要拆分的单个列,对其运行map函数以拆分列中的字符串,然后将其重新组合在一起
c1 = np.hstack([*map(lambda x: re.findall(r'[-+]\d+\.\d+',x), d[:, 2])]).reshape(d.shape[0], 2)
这是很多解开的,所以让我们仔细看看。lambda x:re.findall('[-+]\d+',x)
函数将输入字符串拆分为两个单独的字符串并保留其符号。它在映射(…,d[:,2])中使用,该映射将函数映射到第三列的每一行(列索引2,因为它是基于零的)。如果将map
函数直接放入np.hstack
中,最近对np.hstack的更改将抛出警告,因此我们需要将其转换为列表,然后再将其用作np.hstack
函数调用中的参数。一种方法是[*map(…)]
,这就是我们所做的。这就解释了np.hstack
函数,但我们还没有完成。它将返回一维数组而不是二维数组。我们需要根据有多少列来重塑它。在本例中,这个数字不是11,因为我们只从一列拆分为两列
4.连接列(可选)
这个问题并不要求重新组装这些列,但我需要这样做。我想其他人也一样,所以我就是这样做的。使用np.hstack
很容易,如下所示:
d = np.hstack((d[:,0:2], c1, d[:,3:]))
注意我们是如何传递一个包含三个数组的列表的。第一个表示第三列之前的列,然后是第三列变成的两列,最后是第三列之后的列。双亲不是打字错误。np.hstack
函数接受一个参数,因此我们创建一个列表用作该参数,而不是传递三个参数。如果拆分第一列或最后一列,则列表中只有两项
5.写入文件
唷!这是很多,但我们还没有完成。现在我们需要以指定的格式将拆分列写入数据文件。该格式似乎是左对齐的,第一列为10个字符的字符串,右列为8个字符的字符串,由空格分隔。我们将为此使用np.savetxt
np.savetxt('data.txt',c1,fmt='%-10s %8s')
最后说明
如果您已经做到了这一点,那么您已经从许多列中拆分出一个列,并可能将它们重新组合,以生成一个比开始时多出一列的表,或者您有一个具有空格分隔值的文件。伟大的不过有一个警告。在本练习期间,我们已将所有内容强制为字符串。如果要将这些值作为浮点数或其他任何内容处理,则必须转换numpy数组
就目前而言,我相信这个答案完全回答了最初的问题,并有望对其他试图拆分2d numpy数组列的人有用
以下是所有内容的汇总:
import numpy as np
import re
d = np.genfromtxt('data.csv', dtype=str, delimiter=',', skip_header=1, encoding='UTF-8')
c1 = np.hstack([*map(lambda x: re.findall(r'[-+]\d+\.\d+',x), d[:, 2])]).reshape(d.shape[0], 2)
d = np.hstack((d[:,0:2], c1, d[:,3:]))
np.savetxt('data.txt',c1,fmt='%-10s %8s')
干杯 @agconti OP实际上只有一列字符串,表示两列浮点,没有逗号。我用np打开整个文本文件。genfromtxt@user2154410您使用np.genfromtxt
读取它,它可能返回一个2D numpy数组,假设变量为na