2016-07-15 61 views
0

我从文件中读取数据,就像这样:铸造蟒蛇名单numpy的阵列给出了错误的形状

f = open('some/file/path') 
data = f.read().split('\n') 

这给了我像data = ['1 a #', '3 e &'] 如果原始文件是

1一个#

3e的&

我需要它的形式像

[['1','a','#'],['3','e','&']]

,这样我就可以做一个np.swapaxes()它,把它变成

[['1','3'],['a','e'],['#','&']]

但每当我不这样做,swapaxes呼叫失败,这是因为我没有结束正确形状的数组。要打开字​​符串转换为字符串列表,我做的:

for n in range(len(data)): data[n] = data[n].split() 
data = np.array(data) 

但是当我检查形状:

np.shape(data) 
>>>(2,) 

所以我不能换轴。我试过用几种不同的方法来做numpy数组,但似乎所有东西都创建了一个numpy数组,它不知道数组内部还有另一个维数。

+0

重新看一下'data'的内容。你确定它符合你的想法吗?这听起来像你的文件可能以'\ n''结尾,将字符视为行*终止符*而不是行*分隔符*。 – user2357112

回答

0

要打开data = ['1 a #', '3 e &'][['1','a','#'],['3','e','&']]你应该做的:

>>> data2 = [] 
>>> for line in data: 
    data2.append(line.split()) 


>>> data2 
[['1', 'a', '#'], ['3', 'e', '&']] 
+0

这不起作用。我仍然认为numpy认为是一个轴的数组。 – Anonymous

+0

好吧,我告诉你如何将它转换成你要求的列表,没有经验与numpy不幸的 – iScrE4m

0

首先拆分字符串:

import numpy as np 
data = ['1 a #', '3 e &'] 
np.array([x.split() for x in data]).T 
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'], ['#', '&']] 

我可以 '转置' 一个列表也有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) 
0

读文件(条()将删除“\ N”): filename="some/file/path" data=[i.strip().split(' ') for i in open(filename)] print(data) 转换列表以numpy的阵列和交换axis: import numpy as np print(np.asarray(data)) print(np.asarray(data).T)

+0

这似乎并没有工作。 'np.shape(data)'给了我'(2244,)',交换轴什么也不做 – Anonymous

+0

我认为你的文件中可能会有一些特殊的东西。我尝试用我的python3,它运作良好。如果你尝试np.shape(data)并且它给你(2244,),我认为你最好检查你的阅读文件步骤,因为看起来数据没有被正确读取。你能打印一些关于你的输入文件的信息吗?另外,我也尝试np.swapaxes(data,0,1),它也可以。 – upceric