私は自分の問題は本当にシンプルであるべきだと思うが、それでもインターネット上で何の助けも見つけられない。私はPythonが初めてなので、非常に明白な何かを見逃している可能性があります。
この[x x x] (one-dimensional)
のような配列Sがあります。これで、対角行列sigma
をnp.diag(S)
で作成します。次に、この新しい対角配列のサイズを変更して、所有している別の配列と乗算できるようにします。
import numpy as np
...
shape = np.shape((6, 6)) #This will be some pre-determined size
sigma = np.diag(S) #diagonalise the matrix - this works
my_sigma = sigma.resize(shape) #Resize the matrix and fill with zeros - returns "None" - why?
ただし、my_sigma
の内容を印刷すると、"None"
が返されます。誰かが私を正しい方向に向けさせてくれますか?.
助けてくれてありがとう!
キャスパー
グラフィカル:
私はこれを持っています:
[x x x]
これ欲しい:
[x 0 0]
[0 x 0]
[0 0 x]
[0 0 0]
[0 0 0]
[0 0 0] - or some similar size, but the diagonal elements are important.
sigma.resize()
はインプレースで動作するため、None
を返します。 np.resize(sigma, shape)
、一方、結果を返しますが、ゼロでパディングする代わりに、配列の繰り返しでパディングします。
また、shape()
関数は、入力の形状を返します。シェイプを事前定義するだけの場合は、タプルを使用します。
_import numpy as np
...
shape = (6, 6) #This will be some pre-determined size
sigma = np.diag(S) #diagonalise the matrix - this works
sigma.resize(shape) #Resize the matrix and fill with zeros
_
ただし、これにより最初に元の配列が平坦化され、次に指定された形状に再構築され、元の順序が破壊されます。 resize()
を使用する代わりに、ゼロで「パディング」したい場合は、生成されたゼロ行列に直接インデックスを付けることができます。
_# This assumes that you have a 2-dimensional array
zeros = np.zeros(shape, dtype=np.int32)
zeros[:sigma.shape[0], :sigma.shape[1]] = sigma
_
バージョン1.7.0に新しいnumpy関数があります numpy.pad
これは1行で実行できます。他の答えと同様に、 np.diag
パディングの前。タプル((0,N),(0,0))
この回答で使用されているのは、パディングするマトリックスの「サイド」を示しています。
import numpy as np
A = np.array([1, 2, 3])
N = A.size
B = np.pad(np.diag(A), ((0,N),(0,0)), mode='constant')
B
は次と等しい:
[[1 0 0]
[0 2 0]
[0 0 3]
[0 0 0]
[0 0 0]
[0 0 0]]
編集が表示されます...最初にゼロを作成してから、そこにいくつかの数字を移動する必要があります。 np.diag_indices_from
はあなたに役立つかもしれません
bigger_sigma = np.zeros(shape, dtype=sigma.dtype)
diag_ij = np.diag_indices_from(sigma)
bigger_sigma[diag_ij] = sigma[diag_ij]
このソリューションはresize
関数で動作します
サンプル配列を取得する
S= np.ones((3))
print (S)
# [ 1. 1. 1.]
d= np.diag(S)
print(d)
"""
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
"""
これはdosentで、繰り返し値を追加するだけです
np.resize(d,(6,3))
"""
adds a repeating value
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.],
[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
"""
これdoes work
d.resize((6,3),refcheck=False)
print(d)
"""
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]
[ 0. 0. 0.]
[ 0. 0. 0.]
[ 0. 0. 0.]]
"""
別の純粋なpythonソリューションは
a = [1, 2, 3]
b = []
for i in range(6):
b.append((([0] * i) + a[i:i+1] + ([0] * (len(a) - 1 - i)))[:len(a)])
b
は
[[1, 0, 0], [0, 2, 0], [0, 0, 3], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
それは恐ろしい解決策です、私はそれを認めます。ただし、使用できるlist
型の一部の関数を示しています。