webentwicklung-frage-antwort-db.com.de

Python: Größe eines vorhandenen Arrays ändern und mit Nullen füllen

Ich denke, dass mein Problem wirklich einfach sein sollte, aber ich kann keine Hilfe finden. __ im Internet. Ich bin sehr neu in Python, daher kann es sein, dass .__ etwas sehr offensichtliches fehlt.

Ich habe ein Array, S wie dieses [x x x] (one-dimensional). Ich erstelle jetzt eine Diagonalmatrix, sigma, mit np.diag(S) - soweit, so gut. Nun möchte ich Dieses neue diagonale Array so ändern, dass ich es mit einem anderen Array multiplizieren kann, das Ich habe.

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?

Wenn ich jedoch den Inhalt von my_sigma drucke, erhalte ich "None". Kann mir jemand bitte In die richtige Richtung weisen, weil ich mir nicht vorstellen kann, dass dies. so kompliziert sein sollte.

Vielen Dank im Voraus für jede Hilfe!

Kasper

Grafisch:

Ich habe das: 

[x x x]

Ich will das:

[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() gibt None zurück, da es an Ort und Stelle arbeitet. np.resize(sigma, shape) gibt hingegen das Ergebnis zurück, aber statt mit Nullen aufgefüllt zu werden, wird mit Wiederholungen des Arrays aufgefüllt.

Die Funktion shape() gibt auch die Form der Eingabe zurück. Wenn Sie nur eine Form vordefinieren möchten, verwenden Sie einfach einen Tupel.

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

Dadurch wird jedoch zunächst Ihr ursprüngliches Array abgeflacht und anschließend in die angegebene Form gebracht, wodurch die ursprüngliche Reihenfolge zerstört wird. Wenn Sie nur mit Nullen "auffüllen" möchten, können Sie, anstatt resize() zu verwenden, direkt in eine generierte Nullmatrix indexieren.

# This assumes that you have a 2-dimensional array
zeros = np.zeros(shape, dtype=np.int32)
zeros[:sigma.shape[0], :sigma.shape[1]] = sigma
18
voithos

In Version 1.7.0 gibt es eine neue numpy-Funktion numpy.pad , die dies einzeilig ausführen kann. Wie die anderen Antworten können Sie die Diagonalmatrix vor dem Auffüllen mit np.diag erstellen. Der in dieser Antwort verwendete Tuple ((0,N),(0,0)) gibt die "Seite" der Matrix an, die aufgefüllt werden soll. 

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 ist jetzt gleich:

[[1 0 0]
 [0 2 0]
 [0 0 3]
 [0 0 0]
 [0 0 0]
 [0 0 0]]
53
Hooked

Ich sehe die Bearbeitung ... Sie müssen zuerst die Nullen erstellen und dann einige Zahlen hineinschieben. np.diag_indices_from könnte für Sie nützlich sein

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

Diese Lösung arbeitet mit der Funktion resize

Nehmen Sie ein Musterarray

S= np.ones((3))
print (S)
# [ 1.  1.  1.]
d= np.diag(S) 
print(d)
"""
[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]]

"""

Dieses funktioniert nicht , es addiert einfach wiederholende Werte

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.]])
"""

Diese macht Arbeit

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.]]
"""
1
Eka

Eine weitere reine Python-Lösung ist

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 ist jetzt

[[1, 0, 0], [0, 2, 0], [0, 0, 3], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

es ist eine abscheuliche Lösung, das gebe ich zu, aber es zeigt einige Funktionen des Typs list, die verwendet werden können.

0
FraggaMuffin