Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用numpy将列拆分为两列_Python_Numpy - Fatal编程技术网

Python 使用numpy将列拆分为两列

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

我有一个包含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.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