2010-10-04 50 views
2

这是我想创建二维矩阵在python中创建2d数组?

m=4 
tagProb=[[]]*(m+1) 
count=0 
index=0 
for line in lines: 
    print(line) 
    if(count < m+1): 
     tagProb[index].append(line.split('@@')[2].strip()) 
     count+=1 
    if(count == m+1): // this check to goto next index 
     count = 0 
     index+=1 
print(tagProb) 

我得到的O/P

[['0.0', '0.6', '0.05', '0.3', '0.05', '0.1', '0.0', '0.6', '0.0', '0.0', '0.1', '0.0', '0.0', '0.9', '0.0', '0.1', '0.0', '0.2', '0.7', '0.0', '0.1', '0.0', '0.9', '0.0', 0.0'], ['0.0', '0.6', '0.05', '0.3', '0.05', '0.1', '0.0', '0.6', '0.0', '0.0', '0.1', '0.0', .0', '0.9', '0.0', '0.1', '0.0', '0.2', '0.7', '0.0', '0.1', '0.0', '0.9', '0.0', '0.0'], '0.0', '0.6', '0.05', '0.3', '0.05', '0.1', '0.0', '0.6', '0.0', '0.0', '0.1', '0.0', '0.0','0.9', '0.0', '0.1', '0.0', '0.2', '0.7', '0.0', '0.1', '0.0', '0.9', '0.0', '0.0'] ] 

所有值附加和列表具有相同的值的代码。 我该如何避免这种情况?

+3

旁注:如果你想做矩阵运算,你真的想要使用http://numpy.scipy.org – 2010-10-04 21:34:25

+0

同意Jim Brissom之上的那个numpy是要走的路,如果你在做严肃的矩阵运算,但是还有另外一种方法来模拟Python中的二维数组:使用一个字典,并且使用元组(行,列)作为键。对某些应用有用,对别人来说很尴尬。 – 2010-10-04 22:56:43

回答

10

您在列表使用*,其中有一个疑难杂症 - 它将使很多的相同对象引用的列表。对于像int s或tuple s这样的不可变数据,这是很好的,但不适用于像list这样的可变数据,因为更改其中一个对象会改变它们。请参阅:

>>> foo = [[]]*10 
>>> foo[0].append(1) 
>>> foo 
[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]] 

如果你不希望这种情况发生,避免它的标准方法是使用列表理解,这将初始化列表中有新的对象:

>>> bar = [[] for _ in range(10)] 
>>> bar[0].append(1) 
>>> bar 
[[1], [], [], [], [], [], [], [], [], []] 

然而,这个问题并没有在习惯用法的Python中出现很多,因为初始化一个大列表并不是一件常见的事情 - 它非常像C心态。 (这并不是说它有时候不是正确的做法 - Python是多范例的!)

在另一个注释中,你的代码不好。 Python中的for循环用于处理迭代对象,以便您不必手动管理索引变量(代码中的indexcount)。倒不如重写如下:

import numpy as np 
m = 4 
tagProb = np.array(list(line.split("@@")[2].strip() for line in lines))) 
tagProb = tagProb.reshape((m+1,-1)).T 

说明:第一行定义tagProb作为numpy的阵列(一个快速的基于C-阵列型有大量的线性代数函数)一维的所有的值一排。第二行将它强制为高度为m+1和推断宽度的矩阵(注意,它必须是正方形才能工作;如果需要,可以用None填充),然后转换它。我相信这就是你的迭代所做的事情,但有点难以遵循 - 让我知道你是否想要这样做。

+0

初始化列表是一个C范例 – Falmarri 2010-10-05 00:06:26

1

一次创建一个列表,并把它们插入:

import copy 
m=4 
tagProb=[] 
count=0 
index=0 
for line in lines: 
    print(line) 
    innerlist = [] 
    if(count < m+1): 
     innerlist.append(line.split('@@')[2].strip()) 
     count+=1 
    if(count == m+1): // this check to goto next index 
     count = 0 
     index+=1 
     tagProb.append(copy.deepcopy(innerlist)) 
     innerlist = [] 
print(tagProb) 

正如你可以看到,有一个innerlist被添加到,然后对每一行,它增加了列表中列出的名单。 (虽然你可能想做一个列表副本)。

+0

这个小改动 – harshit 2010-10-04 21:44:40

0
m=4 
tagProb=[] 
count=0 
index=0 
innerlist = [] 
for line in lines: 
print(line) 

if(count < m+1): 
    innerlist.append(line.split('@@')[2].strip()) 
    count+=1 
if(count == m+1): // this check to goto next index 
    count = 0 
    index+=1 
    tagProb.append(innerlist) 
    innerlist = [] 
print(tagProb)