将python列表转换为numpy数组会给出错误的形状

时间:2016-07-15 23:56:40

标签: python arrays numpy

我正在读取文件中的数据,如下所示:

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数组,该数组并不知道数组中数组内部还有另一个维度。

4 个答案:

答案 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会返回一个行列表,但它们仍会包含\nstrip会删除。另外需要注意的是数据线之间的空行

===================

如果不清楚,

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)