我正在读取文件中的数据,如下所示:
f = open('some/file/path')
data = f.read().split('\n')
这给了我类似data = ['1 a #', '3 e &']
的内容
如果原始文件是
1 a#
3 e&
我需要像
这样的形式 [['1','a','#'],['3','e','&']]
这样我就可以对其进行np.swapaxes()
并将其转换为
[['1','3'],['a','e'],['#','&']]
但每当我这样做时,swapaxes
调用失败,这是因为我没有以正确形状的numpy数组结束。要将字符串转换为字符串列表,我会这样做:
for n in range(len(data)): data[n] = data[n].split()
data = np.array(data)
但是当我检查形状时:
np.shape(data)
>>>(2,)
所以我不能交换轴。我曾尝试以几种不同的方式执行numpy
数组,但所有内容似乎都创建了一个numpy
数组,该数组并不知道数组中数组内部还有另一个维度。
答案 0 :(得分:0)
要将data = ['1 a #', '3 e &']
变成[['1','a','#'],['3','e','&']]
,您应该这样做:
>>> data2 = []
>>> for line in data:
data2.append(line.split())
>>> data2
[['1', 'a', '#'], ['3', 'e', '&']]
答案 1 :(得分:0)
首先拆分字符串:
import numpy as np
data = ['1 a #', '3 e &']
np.array([x.split() for x in data]).T
答案 2 :(得分:0)
你的分割线看起来很好
In [110]: data = ['1 a #', '3 e &']
In [111]: for n in range(len(data)): data[n] = data[n].split()
In [112]: data
Out[112]: [['1', 'a', '#'], ['3', 'e', '&']]
In [113]: A=np.array(data)
In [114]: A
Out[114]:
array([['1', 'a', '#'],
['3', 'e', '&']],
dtype='<U1')
In [115]: A.shape
Out[115]: (2, 3)
In [116]: A.T
Out[116]:
array([['1', '3'],
['a', 'e'],
['#', '&']],
dtype='<U1')
In [117]: A.T.tolist()
Out[117]: [['1', '3'], ['a', 'e'], ['#', '&']]
我可以移植&#39;包含zip
的列表列表:
In [119]: list(zip(*data))
Out[119]: [('1', '3'), ('a', 'e'), ('#', '&')]
原始列表拆分也可以使用列表解析
完成In [120]: [i.split() for i in ['1 a #', '3 e &']]
Out[120]: [['1', 'a', '#'], ['3', 'e', '&']]
您可以将文件读取和拆分与
类似[i.strip().split() for i in f.readlines()]
readlines
会返回一个行列表,但它们仍会包含\n
,strip
会删除。另外需要注意的是数据线之间的空行
===================
如果不清楚,
In [122]: data = ['1 a #', '3 e &']
In [123]: np.array(data)
Out[123]:
array(['1 a #', '3 e &'],
dtype='<U5')
生成一个2元素数组,其中每个元素都是一个5个字符的字符串。任何重塑或转置的数量都不会将其转换为单个元素字符串数组。您可以将其重塑为其他2个元素数组
In [124]: _.reshape(2,1)
Out[124]:
array([['1 a #'],
['3 e &']],
dtype='<U5')
In [125]: __.reshape(1,2,1)
Out[125]:
array([[['1 a #'],
['3 e &']]],
dtype='<U5')
我可以view
将它作为单个字符数组:
In [128]: A.view('<U1')
Out[128]:
array(['1', ' ', 'a', ' ', '#', '3', ' ', 'e', ' ', '&'],
dtype='<U1')
In [129]: A.view('<U1').reshape(5,2)
Out[129]:
array([['1', ' '],
['a', ' '],
['#', '3'],
[' ', 'e'],
[' ', '&']],
dtype='<U1')
但是这些空白字符会妨碍你。
还有一个将字符串函数应用于数组的库:
np.concatenate(np.char.split(A)).reshape(2,3)
答案 3 :(得分:0)
读取文件(strip()将删除&#39; \ n&#39;):
filename="some/file/path"
data=[i.strip().split(' ') for i in open(filename)]
print(data)
将列表转换为numpy数组并交换轴:
import numpy as np
print(np.asarray(data))
print(np.asarray(data).T)