簡體   English   中英

在python中創建2d數組?

[英]create 2d array in 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'] ]

附加所有值,列表具有相同的值。 我怎么能避免這個?

您在列表上使用* ,它有一個陷阱 - 它將列出對同一對象的大量引用。 這對於像inttuple這樣的不可變類很好,但不適用於像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定義為一tagProb的numpy數組(具有大量線性代數函數的快速基於C的數組類型),其中所有值都在一行中。 第二行將它強制轉換為高度m+1和推斷寬度的矩陣(注意它必須是正方形才能工作;如果需要,你可以用None填充它)然后轉置它。 我相信這是你的迭代所做的,但它有點難以理解 - 讓我知道你是否想要這樣做。

一次創建一個列表並插入它們:

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被添加到,然后對每一行,它增加了列表中列出的名單。 (盡管如此,您可能希望進行列表復制)。

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) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM