如何快速转换为列表列表,在每个元素的开头插入一个字符串?

时间:2013-06-30 22:06:00

标签: python numpy list-comprehension

我使用以下方法将文件读入Python脚本:

data=np.loadtxt('myfile')

其中给出了'numpy.ndarray'类型的数字列表,格式为:

print(data) = [1, 2, 3]

我需要将其转换为列表列表,每个列表都有一个单字符串'a'和上述值之一,即:

[[a,1],
 [a,2],
 [a,3]]

(请注意,'a'在每个列表之间没有差异,它仍然是一个只包含字母'a'的字符串)

最快和最恐怖的方式是什么? 我尝试了几种不同形式的列表理解,但我经常最终会显示“无”行。结果不一定必须是'numpy.ndarray'类型,但它会更受欢迎。

另外,我怎样才能将这种方法扩展到已经作为列表列表从文件中读入的数据,即:

data2=np.loadtxt('myfile2',delimiter=' ')
print(data2)= [[1,2],
               [3,4],
               [5,6]]

给出结果:

[[a,1,2],
 [a,3,4],
 [a,5,6]]

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

也许是这样的:

>>> import numpy as np
>>> data = [1,2,3]
>>> a = np.empty([len(data),2], dtype=object)
>>> a
array([[None, None],
       [None, None],
       [None, None]], dtype=object)
>>> a[:,0]='a'
>>> a
array([[a, None],
       [a, None],
       [a, None]], dtype=object)
>>> a[:,1]=data
>>> a
array([[a, 1],
       [a, 2],
       [a, 3]], dtype=object)
>>> data2=np.array([[1,2],[3,4],[5,6]])
>>> data2
array([[1, 2],
       [3, 4],
       [5, 6]])
>>> b = np.empty([len(data2),3],dtype=object)
>>> b
array([[None, None, None],
       [None, None, None],
       [None, None, None]], dtype=object)
>>> b[:,0]='a'
>>> b
array([[a, None, None],
       [a, None, None],
       [a, None, None]], dtype=object)
>>> b[:,1:]=data2
>>> b
array([[a, 1, 2],
       [a, 3, 4],
       [a, 5, 6]], dtype=object)

编辑:为了回应OP的评论,您可以通过执行此操作来标记列:

>>> data2=np.array([[1,2],[3,4],[5,6]])
>>> c = zip('a'*len(data2),data2[:,0],data2[:,1])
>>> c
[('a', 1, 2), ('a', 3, 4), ('a', 5, 6)]
>>> d = np.array(c,dtype=[('A', 'a1'),('Odd Numbers',int),('Even Numbers',int)])

>>> d
array([('a', 1, 2), ('a', 3, 4), ('a', 5, 6)],
      dtype=[('A', '|S1'), ('Odd Numbers', '<i4'), ('Even Numbers', '<i4')])
>>> d['Odd Numbers']
array([1, 3, 5])

我不太了解它,但数组d是一个记录数组。您可以在Structured Arrays (and Record Arrays)找到信息。我遇到了“A”列的dtype问题。如果我放('A', str),那么我的“A”列始终为空,''。在查看Specifying and constructing data types之后,我尝试使用('A', 'a1')并且它有效。