2016-04-05 176 views
1

我一直在尋找這個,但我找不到任何幫助。我在製作一個我想要的大小的數組時遇到了一些麻煩。在Python中將列表列表轉換爲數組

到目前爲止,我已經創建了一個列表的列表與此代碼:

n=4 
def matrixA(k): 
    A=[] 
    for m in range(0,k): 
     row=[] 
     #A.append([]) 
     for n in range(0,k): 
      if (n==(m+1)) or (n==(m-1)): 
       row.append(-deltaX/(deltaX)**2) 
      if (n==m): 
       row.append(2*deltaX/(deltaX)**2) 
      else: 
       row.append(0) 
     A.append(row) 
    return A 
pprint.pprint(matrixA(n)) 
print len(matrixA(n)) 

我得到這個輸出。

[[128.0, -64.0, 0, 0, 0], 
[-64.0, 0, 128.0, -64.0, 0, 0], 
[0, -64.0, 0, 128.0, -64.0, 0], 
[0, 0, -64.0, 0, 128.0]] 
4 

現在,我想使這個數組的大小(4,4)。我的問題是,當我這樣做(列表轉換爲一個數組,並試圖塑造它):

A=numpy.array(matrixA(n)) 
print A 
print "This is its shape:",A.shape 
A.shape=(n,n) 

我獲得:

[[128.0, -64.0, 0, 0, 0] [-64.0, 0, 128.0, -64.0, 0, 0] 
[0, -64.0, 0, 128.0, -64.0, 0] [0, 0, -64.0, 0, 128.0]] 
This is its shape: (4,) 

然後一個錯誤:

ValueError: total size of new array must be unchanged 

我該如何從這裏得到一個大小爲(4,4)的數組呢?

+3

您的清單有5或6個元素,您打算如何將其製作成4x4陣列?另外,由於列表中元素的數量不同,'numpy'不會創建2D數組,而是會創建一個由d列= object組成的1D數組。 – fjarri

+0

哇,我不敢相信我沒注意到。你知道爲什麼這裏有5或6個,而不是5個?(我也改變了從k到k-1的範圍,因爲你指出這是因爲我希望它是4而不是5,謝謝。) –

+2

我猜想循環內的第二個'if'應該是'elif '。目前您在一次迭代中有時會追加到'row'兩次。另外,你正在覆蓋'n',不知道你是否想要。 – fjarri

回答

0

轉換嵌套列表到一個數組很簡單,和你做正確:

numpy.array(matrixA(n))

它不工作的原因是因爲你實際上產生嵌套列表具有不規則數「列」

有問題的部分是因爲你缺少一個elif

if (n==(m+1)) or (n==(m-1)): 
    row.append(-deltaX/(deltaX)**2) 
if (n==m): 
    row.append(2*deltaX/(deltaX)**2) 

將您的循環更改爲:

for m in range(0,k-1): 
    row=[] 
    #A.append([]) 
    for n in range(0,k-1): 
     if (n==(m+1)) or (n==(m-1)): 
      row.append(-deltaX/(deltaX)**2) 
     elif (n==m): 
      row.append(2*deltaX/(deltaX)**2) 
     else: 
      row.append(0) 
    A.append(row) 
+0

我很確定有問題的部分是下一行,它應該是'elif',而不是'if'。 –

+0

是的,我太急於點擊提交按鈕;) – Simon

2

歡迎來到世界各地。

看來你想:

array([[ 128., -64., 0., 0.], 
     [ -64., 128., -64., 0.], 
     [ 0., -64., 128., -64.], 
     [ 0., 0., -64., 128.]]) 

這是很難想象的行和建名單列表時的cols指數看。在numpy中,你先塑造,然後填充,這通常更容易。

循序漸進:

In [37]: from numpy import eye,diag,ones # some useful functions 

In [38]: eye(4) # identity matrix 
Out[38]: 
array([[ 1., 0., 0., 0.], 
     [ 0., 1., 0., 0.], 
     [ 0., 0., 1., 0.], 
     [ 0., 0., 0., 1.]]) 

In [39]: eye(4)*128 
Out[39]: 
array([[ 128., 0., 0., 0.], 
     [ 0., 128., 0., 0.], 
     [ 0., 0., 128., 0.], 
     [ 0., 0., 0., 128.]]) 

In [40]: ones(3) 
Out[40]: array([ 1., 1., 1.]) 

In [41]: diag(ones(3),1) # see help(diag) 
Out[41]: 
array([[ 0., 1., 0., 0.], 
     [ 0., 0., 1., 0.], 
     [ 0., 0., 0., 1.], 
     [ 0., 0., 0., 0.]]) 

In [42]: diag(ones(3),1).T # transpose 
Out[42]: 
array([[ 0., 0., 0., 0.], 
     [ 1., 0., 0., 0.], 
     [ 0., 1., 0., 0.], 
     [ 0., 0., 1., 0.]]) 

所以,你想的是一樣的東西:

def arrayA(n,deltaX): 
    A=eye(n) # id matrix of size n 
    B= diag(ones(n-1),1) # just ahead 
    return (2*A-B-B.T)*(deltaX/deltaX**2) 

並運行:

In [45]: arrayA(4,1/64) 
Out[45]: 
array([[ 128., -64., 0., 0.], 
     [ -64., 128., -64., 0.], 
     [ 0., -64., 128., -64.], 
     [ 0., 0., -64., 128.]]) 

而對於大的矩陣,這是速度快:

In [57]: %timeit arrayA(100,1/64) 
1000 loops, best of 3: 326 µs per loop 

In [58]: %timeit matrixA(100) 
100 loops, best of 3: 14.9 ms per loop 
相關問題