web-dev-qa-db-ja.com

Python:既存の配列のサイズを変更し、ゼロで埋めます

私は自分の問題は本当にシンプルであるべきだと思うが、それでもインターネット上で何の助けも見つけられない。私はPythonが初めてなので、非常に明白な何かを見逃している可能性があります。

この[x x x] (one-dimensional)のような配列Sがあります。これで、対角行列sigmanp.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.
24
hjweide

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
_
19
voithos

バージョン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]]
55
Hooked

編集が表示されます...最初にゼロを作成してから、そこにいくつかの数字を移動する必要があります。 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] 
4
Phil Cooper

このソリューションは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.]]
"""
2
Eka

別の純粋な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型の一部の関数を示しています。

0
FraggaMuffin