indizierte Auswahl mit numpy

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Erhy
User
Beiträge: 64
Registriert: Mittwoch 2. Januar 2019, 21:09

Hallo!

mein Beispiel:
import numpy as np

A = np.arange(7*5, dtype=np.int32).reshape(7, 5)

addVals = np.stack( ( A, A ) )
addVals[1] = addVals[0] + 100

mask = np.zeros_like(A)
mask[1:-1, 1:-1] = A[1:-1, 1:-1] % 2 # for decision, which value from addVals
A_w = A + addVals[mask] # but resultls in array with shape (7, 5, 7, 5)
Wie gelingt es mir eine Zuweisung zu machen, bei der auf die Quelle über einen Index zugewiesen wird?

Danke für euren Rat
Erhy
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Code: Alles auswählen

import numpy as np

A = np.arange(7*5, dtype=np.int32).reshape(7, 5)
A

array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24],
       [25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34]])

addVals = np.stack( ( A, A ) )
addVals[1] = addVals[0] + 100
addVals

array([[[  0,   1,   2,   3,   4],
        [  5,   6,   7,   8,   9],
        [ 10,  11,  12,  13,  14],
        [ 15,  16,  17,  18,  19],
        [ 20,  21,  22,  23,  24],
        [ 25,  26,  27,  28,  29],
        [ 30,  31,  32,  33,  34]],

       [[100, 101, 102, 103, 104],
        [105, 106, 107, 108, 109],
        [110, 111, 112, 113, 114],
        [115, 116, 117, 118, 119],
        [120, 121, 122, 123, 124],
        [125, 126, 127, 128, 129],
        [130, 131, 132, 133, 134]]])

addVals.shape

(2, 7, 5)   # Ist dir bewusst und ist das gewollt, dass addVals diesen Shape hat und so aussieht ?


mask = np.zeros_like(A)
mask

array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])

mask[1:-1, 1:-1] = A[1:-1, 1:-1] % 2 # for decision, which value from addVals
mask

array([[0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [0, 1, 0, 1, 0],
       [0, 0, 1, 0, 0],
       [0, 1, 0, 1, 0],
       [0, 0, 1, 0, 0],
       [0, 0, 0, 0, 0]])

# mask hat einen shape (7,5) und sieht so aus, ist das (Muster) so richtig und gewollt?

B = addVals[mask]

# was soll diese Zeile bewirken, wie soll deiner Meinung nach das Ergebnis aussehen ?
# Das Ergebnis hat hier schon den shape (7, 5, 7, 5)
B.shape

(7, 5, 7, 5)

A_w = A + B # but resultls in array with shape (7, 5, 7, 5)
A_w.shape

(7, 5, 7, 5)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Erhy
User
Beiträge: 64
Registriert: Mittwoch 2. Januar 2019, 21:09

Danke für die Antwort!
ThomasL hat geschrieben: Sonntag 1. August 2021, 08:50

Code: Alles auswählen

import numpy as np

A = np.arange(7*5, dtype=np.int32).reshape(7, 5)
A

array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24],
       [25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34]])

addVals = np.stack( ( A, A ) )
addVals[1] = addVals[0] + 100
addVals

array([[[  0,   1,   2,   3,   4],
        [  5,   6,   7,   8,   9],
        [ 10,  11,  12,  13,  14],
        [ 15,  16,  17,  18,  19],
        [ 20,  21,  22,  23,  24],
        [ 25,  26,  27,  28,  29],
        [ 30,  31,  32,  33,  34]],

       [[100, 101, 102, 103, 104],
        [105, 106, 107, 108, 109],
        [110, 111, 112, 113, 114],
        [115, 116, 117, 118, 119],
        [120, 121, 122, 123, 124],
        [125, 126, 127, 128, 129],
        [130, 131, 132, 133, 134]]])

addVals.shape

(2, 7, 5)   # Ist dir bewusst und ist das gewollt, dass addVals diesen Shape hat und so aussieht ?
ja, so wollte ich es

Code: Alles auswählen

mask = np.zeros_like(A)
mask

array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])

mask[1:-1, 1:-1] = A[1:-1, 1:-1] % 2 # for decision, which value from addVals
mask

array([[0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [0, 1, 0, 1, 0],
       [0, 0, 1, 0, 0],
       [0, 1, 0, 1, 0],
       [0, 0, 1, 0, 0],
       [0, 0, 0, 0, 0]])
# mask hat einen shape (7,5) und sieht so aus, ist das (Muster) so richtig und gewollt?
ja, so wollte ich es

Code: Alles auswählen

B = addVals[mask]

# was soll diese Zeile bewirken, wie soll deiner Meinung nach das Ergebnis aussehen ?
wollte ein B mit shape wie addVals[0] und dem Inhalt mit den Werten
addVals[0] wenn die korrespondierenden Werte in mask 0 sind und
addVals[1] wenn die korrespondierenden Werte in mask 1 sind
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Code: Alles auswählen

    # Du brauchst zwei Masken
    # einmal die bisherige
    
    zero_mask = np.zeros_like(A)
    zero_mask[1:-1, 1:-1] = A[1:-1, 1:-1] % 2
    zero_mask

    array([[0, 0, 0, 0, 0],
           [0, 0, 1, 0, 0],
           [0, 1, 0, 1, 0],
           [0, 0, 1, 0, 0],
           [0, 1, 0, 1, 0],
           [0, 0, 1, 0, 0],
           [0, 0, 0, 0, 0]])


    # und dann die "0/1 invertierte"
    
    one_mask = np.ones_like(A) - zero_mask
    one_mask

    array([[1, 1, 1, 1, 1],
           [1, 1, 0, 1, 1],
           [1, 0, 1, 0, 1],
           [1, 1, 0, 1, 1],
           [1, 0, 1, 0, 1],
           [1, 1, 0, 1, 1],
           [1, 1, 1, 1, 1]])


    # und dann kannst du B durch Multiplikation und Addition erzeugen
    
    B = addVals[0] * one_mask + addVals[1] * zero_mask
    B

    array([[  0,   1,   2,   3,   4],
           [  5,   6, 107,   8,   9],
           [ 10, 111,  12, 113,  14],
           [ 15,  16, 117,  18,  19],
           [ 20, 121,  22, 123,  24],
           [ 25,  26, 127,  28,  29],
           [ 30,  31,  32,  33,  34]])


    # und dann der letzte Schritt
    A_w = A + B
    A_w

    array([[  0,   2,   4,   6,   8],
           [ 10,  12, 114,  16,  18],
           [ 20, 122,  24, 126,  28],
           [ 30,  32, 134,  36,  38],
           [ 40, 142,  44, 146,  48],
           [ 50,  52, 154,  56,  58],
           [ 60,  62,  64,  66,  68]])
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Erhy
User
Beiträge: 64
Registriert: Mittwoch 2. Januar 2019, 21:09

ThomasL hat geschrieben: Sonntag 1. August 2021, 16:44 # Du brauchst zwei Masken
Hoffte es gibt eine Numpy Funktion für eine derartige Auswahl

Werde mein tatsächliches Problem in einem separaten Thread schildern.

Erhy
Antworten