2010-10-04 61 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)