2016-08-24 7 views
1

オブジェクトとしてdtypeを持つnp.arrayがあります。ここでの各要素は、dtypeがfloatで形状が(2,2)のnp.arrayです。数学では、2行2列の行列です。私の目的は、すべてのオブジェクト型要素を浮動小数点型の要素に変換して、1つの2次元行列を得ることです。これは、以下の例によってより良く提示することができます。Python 3では、np.arrayオブジェクト型をfloat型に変換し、オブジェクト要素の変数番号を

dA = 2 # dA is the dimension of the following A, here use 2 as example only 
A = np.empty((dA,dA), dtype=object) # A is a np.array with dtype as object 
A[0,0] = np.array([[1,1],[1,1]]) # each element in A is a 2-by-2 matrix 
A[0,1] = A[0,0]*2 
A[1,0] = A[0,0]*3 
A[1,1] = A[0,0]*4 

私の目的は、1つの行列B(Bの次元は2 * dA×2 * dA)を持つことです。 DAは2に固定されている場合は、物事は、私はハードコード

a00 = A[0,0] 
a01 = A[0,1] 
a10 = A[1,0] 
a11 = A[1,1] 
B0 = np.hstack((a00,a01)) 
B1 = np.hstack((a10,a11)) 
B = np.vstack((B0,B1)) 

しかし、現実にすることができるので、より簡単にすることができ数学におけるBの形が

B = 
    1 1 2 2 
    1 1 2 2 
    3 3 4 4 
    3 3 4 4 

する必要があり、DAは変数であり、それは2または任意の他の整数とすることができる。それから私はそれをやる方法を知らない。私はネストされたループが助けることができると思うが、多分あなたは素晴らしいアイデアを持っている。 MATLABにcell2mat関数のようなものがあれば素晴らしいでしょう。ここではA [i、j]をMATLABのセルとして見ることができるからです。

ありがとうございます。

+0

「A」にnumpyオブジェクト配列を使用しているのはなぜですか?私が見ることのできるところから、リストのリスト、あるいは長さが4のリストだけでもうまくいくでしょう。 –

+0

@WarrenWeckesser理由は:私のプログラムでは、 "A"は2本の銅線のシステムの特性行列です。"A"を行列と見なすので、その主対角ブロック "A [0,0]"と "A [1,1]"はそれぞれワイヤ0とワイヤ1の特性です。対角線外のブロックは、これらの2本のワイヤに「A [0,1]」および「A [1,0]」の相互影響を与えます。これらの4つのブロックは個別に計算されます。それらをすべて入手した後、それらを1つの行列 "A"に組み立てたいと思います。行列インデックススタイル "[i、j]"を使用すると、計算プロセス全体をプログラムするのが簡単になり、技術的背景を持つ人々にとって読みやすくなります。 – aura

+0

OK、それは意味があります。その場合、2次元のオブジェクト配列の代わりに、4次元配列 'A = np.empty((dA、dA、2、2))'を使用します。私は可能な限りオブジェクト配列を避けるようにしています。多くの低音と盛り上がりの機能はうまく機能しません。 –

答えて

2

ここは簡単な方法です。

あなたA

In [137]: A 
Out[137]: 
array([[array([[1, 1], 
     [1, 1]]), array([[2, 2], 
     [2, 2]])], 
     [array([[3, 3], 
     [3, 3]]), array([[4, 4], 
     [4, 4]])]], dtype=object) 

使用numpy.bmatが、最初のPythonのリストにAを変換するので、bmatは、我々が望むものを行います。

In [138]: B = np.bmat(A.tolist()) 

In [139]: B 
Out[139]: 
matrix([[1, 1, 2, 2], 
     [1, 1, 2, 2], 
     [3, 3, 4, 4], 
     [3, 3, 4, 4]]) 

結果は、実際にnumpy.matrixです。

In [140]: B = np.bmat(A.tolist()).A 

In [141]: B 
Out[141]: 
array([[1, 1, 2, 2], 
     [1, 1, 2, 2], 
     [3, 3, 4, 4], 
     [3, 3, 4, 4]]) 

がここに代替です:あなたが定期的にnumpyの配列が必要な場合は、matrixオブジェクトの.A属性を使用します。 (それはまだA.tolist()使用しています。)一般的なケースでは

In [164]: np.swapaxes(A.tolist(), 1, 2).reshape(4, 4) 
Out[164]: 
array([[1, 1, 2, 2], 
     [1, 1, 2, 2], 
     [3, 3, 4, 4], 
     [3, 3, 4, 4]]) 

、あなたのような何か必要があります:

In [165]: np.swapaxes(A.tolist(), 1, 2).reshape(A.shape[0]*dA, A.shape[1]*dA) 
Out[165]: 
array([[1, 1, 2, 2], 
     [1, 1, 2, 2], 
     [3, 3, 4, 4], 
     [3, 3, 4, 4]]) 
+0

それは私の質問を完全に解決します。ありがとう! – aura

2

あなたvstack/hstackを書くことができ、よりコンパクトに、かつ一般的に

In [132]: np.vstack((np.hstack(a) for a in A)) 
Out[132]: 
array([[1, 1, 2, 2], 
     [1, 1, 2, 2], 
     [3, 3, 4, 4], 
     [3, 3, 4, 4]]) 

などを for a in Arowsを繰り返します( A)。

ウォーレンはnp.bmatを推奨します。しかし、bmatコードを見ると、この種のネストされたconcatenate(行ループはarr_rows.append(np.concatenate...)と表示されています)を実行するだけです。

関連する問題