2016-04-05 17 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つの要素がありますが、どのように4×4配列にする予定ですか?また、リスト内の要素数が異なるため、 'numpy'は2D配列を作成せず、代わりに' dtype = object'の1D配列をリストで作成します。 – fjarri

+0

うわー、私はそれを気付かなかったとは信じられません。なぜここに5人ではなく5人か6人いるのか分かりますか?(私は5よりもむしろ4にしたいので、それを指摘して以来、kからk-1までの範囲を変更しました) –

+2

ループ内の2番目の 'if'は' elif '。現在、 'it''をある回の繰り返しで' 'row''に2回追加します。また、あなたはあなたがそれを望むかどうかわからない、 '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

私は問題のある部分が 'if'ではなく' elif'でなければならない次の行であると確信しています。 –

+0

はい、私はあまりにも送信ボタンを押すことに熱心だった;) – Simon

2

numpy worldへようこそ。

あなたがしたいようだ:

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

それはリストのリストを構築するときにrowsとcols指標の観点から考えることは困難です。あなたは最初に形を整えてから、塗りつぶします。これはしばしば簡単です。ステップバイ

ステップ:

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 
関連する問題