2013-05-13 22 views
5

ho un array che assomiglia a questo per esempio:pitone matrice NumPy sostituzione

array([[ 1, 1, 2, 0, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 0, 0, 13, 14], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 0, 24], 
     [25, 26, 27, 28, 29], 
     [30, 31, 32, 33, 34], 
     [35, 36, 37, 38, 39], 
     [40, 41, 42, 43, 44], 
     [45, 46, 47, 48, 49]]) 

ho altri due matrici che sono come:

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

e

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

Nei Voglio prendere il valore 2891 dal secondo array al primo array nella posizione corrispondente e anche 643 dal terzo array al primo v matrice nella posizione corrispondente in modo che la matrice finale dovrebbe essere simile:

array([[ 1, 1, 2, 643, 4], 
     [ 5, 6, 7, 8, 9], 
     [ 10, 2891, 643, 13, 14], 
     [ 15, 16, 17, 18, 19], 
     [ 20, 21, 22, 2891, 24], 
     [ 25, 26, 27, 28, 29], 
     [ 30, 31, 32, 33, 34], 
     [ 35, 36, 37, 38, 39], 
     [ 40, 41, 42, 43, 44], 
     [ 45, 46, 47, 48, 49]]) 

Finora ho provato questo comando:

np.place(a,a<1, np.amax(b)) 

dove a cui il primo array e b cui la 2 ° array. Quello che fa sostituisce semplicemente tutto il valore 0 con il valore 2891. Qualcuno può aiutare?

risposta

5

Potete trovare gli indici in cui y e z sono diversi da zero utilizzando il metodo diverso da zero:

In [9]: y.nonzero() 
Out[9]: (array([2, 4]), array([1, 3])) 

In [10]: z.nonzero() 
Out[10]: (array([0, 2]), array([3, 2])) 

È possibile selezionare i valori associati tramite h fancing indexing:

In [11]: y[y.nonzero()] 
Out[11]: array([2891, 2891]) 

ed è possibile assegnare questi valori a posizioni in x con

In [13]: x[y.nonzero()] = y[y.nonzero()] 

import numpy as np 
x = np.array([[ 1, 1, 2, 0, 4], 
       [ 5, 6, 7, 8, 9], 
       [10, 0, 0, 13, 14], 
       [15, 16, 17, 18, 19], 
       [20, 21, 22, 0, 24], 
       [25, 26, 27, 28, 29], 
       [30, 31, 32, 33, 34], 
       [35, 36, 37, 38, 39], 
       [40, 41, 42, 43, 44], 
       [45, 46, 47, 48, 49]]) 

y = np.array([[ 0, 0, 0, 0], 
       [ 0, 0, 0, 0], 
       [ 0, 2891, 0, 0], 
       [ 0, 0, 0, 0], 
       [ 0, 0, 0, 2891]]) 

z = np.array([[ 0, 0, 0, 643], 
       [ 0, 0, 0, 0], 
       [ 0, 0, 643, 0], 
       [ 0, 0, 0, 0], 
       [ 0, 0, 0, 0]]) 

x[y.nonzero()] = y[y.nonzero()] 
x[z.nonzero()] = z[z.nonzero()] 
print(x) 

rendimenti

[[ 1 1 2 643 4] 
[ 5 6 7 8 9] 
[ 10 2891 643 13 14] 
[ 15 16 17 18 19] 
[ 20 21 22 2891 24] 
[ 25 26 27 28 29] 
[ 30 31 32 33 34] 
[ 35 36 37 38 39] 
[ 40 41 42 43 44] 
[ 45 46 47 48 49]] 
3

Intendi selezionare i valori massimi dal secondo array e dal terzo array? In tal caso, eseguire le seguenti operazioni:

Init dati:

In [48]: arr = array([[ 1, 1, 2, 0, 4], 
    ....: [ 5, 6, 7, 8, 9], 
    ....: [10, 0, 0, 13, 14], 
    ....: [15, 16, 17, 18, 19], 
    ....: [20, 21, 22, 0, 24], 
    ....: [25, 26, 27, 28, 29], 
    ....: [30, 31, 32, 33, 34], 
    ....: [35, 36, 37, 38, 39], 
    ....: [40, 41, 42, 43, 44], 
    ....: [45, 46, 47, 48, 49]]) 

In [49]: arr1 = array([[ 0, 0, 0, 0], 
    ....: [ 0, 0, 0, 0], 
    ....: [ 0, 2891, 0, 0], 
    ....: [ 0, 0, 0, 0], 
    ....: [ 0, 0, 0, 2891]]) 

In [50]: arr2 = array([[ 0, 0, 0, 643], 
    ....: [ 0, 0, 0, 0], 
    ....: [ 0, 0, 643, 0], 
    ....: [ 0, 0, 0, 0], 
    ....: [ 0, 0, 0, 0]]) 

Select e Sostituisci:

In [51]: arr[arr1==arr1.max()] = arr1.max() 

In [52]: arr[arr2==arr2.max()] = arr2.max() 

In [53]: arr 
Out[53]: 
array([[ 1, 1, 2, 643, 4], 
     [ 5, 6, 7, 8, 9], 
     [ 10, 2891, 643, 13, 14], 
     [ 15, 16, 17, 18, 19], 
     [ 20, 21, 22, 2891, 24], 
     [ 25, 26, 27, 28, 29], 
     [ 30, 31, 32, 33, 34], 
     [ 35, 36, 37, 38, 39], 
     [ 40, 41, 42, 43, 44], 
     [ 45, 46, 47, 48, 49]]) 
+1

potrebbe essere più veloce per memorizzare 'arr1.max()'/'arr2.max' – jamylak

+0

thnax per la risposta. Ho capito la spiegazione della seconda risposta, ecco perché accetto quella. Ma anche il tuo funziona. – user2095624

+0

State attenti che ci siano alcune differenze tra le nostre risposte. Seleziono il valore massimo e li sostituisco mentre selezionano quelli diversi da zero e quindi li sostituiscono. Se ci sono due tipi di numeri diversi da zero nel secondo o terzo array, l'output sarà diverso. – waitingkuo

0

In NumPy è possibile pedice array in strano modi. 1. con un allineamento booleano 2. con gli indici

a1[a2 > 0] = a2[a2.nonzero()]