python wie man numpy array mit Nullen auffüllt
Möchte ich wissen, wie kann ich das pad eine 2D-numpy-array mit Nullen mit python 2.6.6 mit numpy version 1.5.0. Sorry! Aber diese sind meine Grenzen. Daher kann ich nicht verwenden np.pad
. Zum Beispiel, ich möchte pad a
mit Nullen, so dass seine Form entspricht b
. Der Grund, warum ich dies tun wollen ist, so kann ich tun:
b-a
so, dass
>>> a
array([[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.]])
>>> b
array([[ 3., 3., 3., 3., 3., 3.],
[ 3., 3., 3., 3., 3., 3.],
[ 3., 3., 3., 3., 3., 3.],
[ 3., 3., 3., 3., 3., 3.]])
>>> c
array([[1, 1, 1, 1, 1, 0],
[1, 1, 1, 1, 1, 0],
[1, 1, 1, 1, 1, 0],
[0, 0, 0, 0, 0, 0]])
Nur so kann ich mir vorstellen, dies zu tun, ist das Anhängen, aber es scheint ziemlich hässlich. gibt es eine sauberere Lösung evtl. mit b.shape
?
Bearbeiten,
Vielen Dank an MSeiferts Antwort. Ich hatte zu reinigen es ein wenig, und das ist, was ich habe:
def pad(array, reference_shape, offsets):
"""
array: Array to be padded
reference_shape: tuple of size of ndarray to create
offsets: list of offsets (number of elements must be equal to the dimension of the array)
will throw a ValueError if offsets is too big and the reference_shape cannot handle the offsets
"""
# Create an array of zeros with the reference shape
result = np.zeros(reference_shape)
# Create a list of slices from offset to offset + shape in each dimension
insertHere = [slice(offsets[dim], offsets[dim] + array.shape[dim]) for dim in range(array.ndim)]
# Insert the array in the result at the specified offsets
result[insertHere] = array
return result
InformationsquelleAutor der Frage user2015487 | 2016-03-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehr einfach, Sie erstellen ein array mit Nullen mithilfe des Verweis-Form:
und legen Sie dann das array, wo Sie es brauchen:
und voila du hast gepolstert er:
Können Sie auch machen es ein bisschen mehr Allgemeinen, wenn Sie definieren, wo Ihr im oberen linken element eingefügt werden soll
aber dann seien Sie vorsichtig, dass Sie nicht offsets größer als erlaubt. Für
x_offset = 2
zum Beispiel wird dies scheitern.Wenn Sie einer beliebigen Anzahl von Dimensionen können Sie eine Liste der Scheiben zum einlegen der original-array. Ich fand es interessant zu spielen ein bisschen herum und erstellt eine padding-Funktion können pad (mit offset) einem beliebigen geformten array solange das array und Referenz die gleiche Anzahl von Dimensionen und die Abstände sind nicht zu groß.
Und einige Testfälle:
InformationsquelleAutor der Antwort MSeifert
NumPy 1.7 (wenn
np.pad
Hinzugefügt wurde) ist ziemlich alt (es wurde veröffentlicht in 2013), so auch wenn die Frage nach einer Möglichkeit gefragt, ohne, dass die Funktion, die ich dachte, es könnte nützlich sein, zu wissen, wie das erreicht werden könnte, mitnp.pad
.Es ist eigentlich ziemlich einfach:
In diesem Fall verwendet, dass ich
0
ist der Standardwert fürmode='constant'
. Aber es könnte auch angegeben werden, indem Sie es explizit:Nur für den Fall, das zweite argument (
[(0, 1), (0, 1)]
) scheint verwirrend: Jedes Listenelement (in diesem Fall Tupel) entspricht einer dimension und Element darin stellt die Polsterung vor (erstes element) und nach (zweites element). Also:In diesem Fall die Polsterung für die erste und zweite Achse sind identisch, man könnte also auch einfach nur pass bei der 2-Tupel:
Fall, dass die Polsterung vor und nach identisch ist, könnte man auch weglassen, das Tupel (in diesem Fall nicht anwendbar, wenn):
Oder wenn die Polsterung vor und nach identisch ist, sondern unterschiedlich für die Achse könnte man auch weglassen, das zweite argument in der inneren Tupel:
Allerdings Neige ich dazu, lieber immer explizit, weil es einfach zu einfach, Fehler zu machen (wenn NumPys Erwartungen unterscheiden sich von Ihren Absichten):
Hier NumPy denkt, dass Sie wollte, pad-alle-Achse mit 1-element vor und 2 Elemente nach jeder Achse! Selbst wenn Sie es beabsichtigt pad mit 1 element in Achse 1 und 2 Elemente für Achse 2.
Ich verwendet Listen von Tupeln für die Polsterung, beachten Sie, dass dies nur "meine Konvention", Sie können auch Listen von Listen oder Tupel von Tupeln, oder auch Tupel von arrays. NumPy prüft nur die Länge des Arguments (oder, wenn es nicht eine Länge) und die Länge der einzelnen Artikel (oder, wenn es hat eine Länge)!
InformationsquelleAutor der Antwort MSeifert
Ich verstehe, dass Ihr Hauptproblem ist, dass Sie brauchen, um zu berechnen
d=b-a
aber deine arrays haben verschiedene Größen. Es gibt keine Notwendigkeit für eine zwischengeschaltete gepolstertec
Können Sie dies lösen, ohne Polsterung:
Ausgabe:
InformationsquelleAutor der Antwort purpletentacle
In Fall müssen Sie einen Zaun von 1s zu einem array:
InformationsquelleAutor der Antwort user3409057