2017-10-02 1 views
1

Ich versuche, in eine numpy Matrix mit einer Maske einzufügen, die eine einzelne Zelle pro Zeile definiert. Effektiv fügt es einen Wert in jede Zeile ein, aber mit einer anderen Spalte. Ich habe versucht, np.insert() ohne Erfolg zu nutzen:Numpy: Wert in verschiedene Spalten für jede Zeile einfügen

>>> x 
array([[False, False, True, False, False], 
     [False, False, True, False, False], 
     [False, False, True, False, False], 
     [False, False, True, False, False], 
     [False, False, True, False, False]], dtype=bool) 
>>> y = np.arange(25).reshape(5,5) 
>>> y 
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]]) 
>>> np.insert(y, np.where(x)[1], 99, axis=1) 
array([[ 0, 1, 99, 99, 99, 99, 99, 2, 3, 4], 
     [ 5, 6, 99, 99, 99, 99, 99, 7, 8, 9], 
     [10, 11, 99, 99, 99, 99, 99, 12, 13, 14], 
     [15, 16, 99, 99, 99, 99, 99, 17, 18, 19], 
     [20, 21, 99, 99, 99, 99, 99, 22, 23, 24]]) 

Immer wenn ich versuche und Einsatz auf der Grundlage der x Maske, es endet Werte zu duplizieren.

Wie bereits erwähnt, kann die Maske möglicherweise so eingerichtet werden, dass sie keine einfache Spalte ist. Zum Beispiel:

>>> x = np.zeros((5, 5), dtype=bool) 
>>> x[1:, 2] = True 
>>> x[0, 1] = True 
>>> x 
array([[False, True, False, False, False], 
     [False, False, True, False, False], 
     [False, False, True, False, False], 
     [False, False, True, False, False], 
     [False, False, True, False, False]], dtype=bool) 

das dann bedeutet, dass ich nicht einfach eine bestimmte Spalte als der Index bei einfügen angeben:

wäre
>>> np.insert(y, 2, [99, 99, 99, 99, 99], axis=1) 
array([[ 0, 1, 99, 2, 3, 4], 
     [ 5, 6, 99, 7, 8, 9], 
     [10, 11, 99, 12, 13, 14], 
     [15, 16, 99, 17, 18, 19], 
     [20, 21, 99, 22, 23, 24]]) 

Die gewünschte Ausgabe:

array([[ 0, 99, 1, 2, 3, 4], 
     [ 5, 6, 99, 7, 8, 9], 
     [10, 11, 99, 12, 13, 14], 
     [15, 16, 99, 17, 18, 19], 
     [20, 21, 99, 22, 23, 24]]) 

Beliebig Hilfe würde sehr geschätzt werden!

+0

Also hat die Maske genau einen wahren Wert pro Zeile? – Divakar

+0

Korrekt. Es gibt immer nur einen True-Wert pro Zeile. Der schwierige Teil ist, dass es sich in einer anderen Spalte als andere True-Werte befinden kann. – SortingHat

Antwort

1

Ansatz # 1: Hier ist ein Weg, um mit boolean-indexing -

def insert_one_per_row(arr, mask, putval): 
    mask_ext = np.column_stack((mask, np.zeros((len(mask),1),dtype=bool))) 
    out = np.empty(mask_ext.shape, dtype=arr.dtype) 
    out[~mask_ext] = arr.ravel() 
    out[mask_ext] = putval 
    return out 

Probelauf -

In [91]: insert_one_per_row(y, x, putval=[-1,-2,-3,-4,-5]) 
Out[91]: 
array([[ 0, -1, 1, 2, 3, 4], 
     [ 5, 6, -2, 7, 8, 9], 
     [10, 11, 12, 13, -3, 14], 
     [-4, 15, 16, 17, 18, 19], 
     [20, 21, -5, 22, 23, 24]]) 

-

In [88]: y 
Out[88]: 
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]]) 

In [89]: x 
Out[89]: 
array([[False, True, False, False, False], 
     [False, False, True, False, False], 
     [False, False, False, False, True], 
     [ True, False, False, False, False], 
     [False, False, True, False, False]], dtype=bool) 

In [90]: insert_one_per_row(y, x, putval=99) 
Out[90]: 
array([[ 0, 99, 1, 2, 3, 4], 
     [ 5, 6, 99, 7, 8, 9], 
     [10, 11, 12, 13, 99, 14], 
     [99, 15, 16, 17, 18, 19], 
     [20, 21, 99, 22, 23, 24]]) 

Wir haben auch unterschiedliche Werte pro Zeile zuweisen Ansatz # 2: Wir werden die abgeflachten True Orte auf der Maske erhalten und die neuen Werte mit np.insert auf einer abgeflachten Version des Eingangsfeldes an den Stellen einsetzen, wie so -

def insert_one_per_row_v2(arr, mask, putval): 
    idx = np.flatnonzero(mask) 
    return np.insert(arr.ravel(), idx, putval).reshape(arr.shape[0],-1) 
0

Eigentlich könnte man np.where

np.where(x, np.full_like(y, 99), y) 
verwenden

Und hier ist die Ausgabe:

In [9]: x 
Out[9]: 
array([[False, True, False, False, False], 
     [False, False, True, False, False], 
     [False, False, True, False, False], 
     [False, False, True, False, False], 
     [False, False, True, False, False]], dtype=bool) 

In [10]: y 
Out[10]: 
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]]) 

In [11]: np.where(x, np.full_like(y, 99), y) 
Out[11]: 
array([[ 0, 99, 2, 3, 4], 
     [ 5, 6, 99, 8, 9], 
     [10, 11, 99, 13, 14], 
     [15, 16, 99, 18, 19], 
     [20, 21, 99, 23, 24]]) 

Dank

+0

Es sieht so aus, als würde der Wert bei diesen Indizes überschrieben. Es ist hauptsächlich das, wonach ich suche, aber ich möchte nicht überschreiben. Ich möchte diesen Index zum Einfügen verwenden. – SortingHat

+0

Dann versuchen Sie @ Divakar Antwort – rojeeer

Verwandte Themen