Ecco un modo utilizzando NumPy broadcasting
-
a[(np.arange(a.shape[0])[:,None] + np.arange(a.shape[1]))%2==0] += 1
Spiegazione: Creiamo fondamentalmente due matrici che sono equivalenti dei i-th
e j-th
iteratori. Chiamiamoli I
e J
.
I = np.arange(a.shape[0])
J = np.arange(a.shape[1])
Ora, per eseguire un'operazione tra tutti i possibili i
e j
, creiamo estendere I
a 2D
da spingendo suoi elementi nella primo asse e creando dimensione singoletto lungo il suo secondo asse.
In senso figurato, l'effetto di trasmissione potrebbe essere messo in questo modo:
I[:,None] : M , 1
J : 1 , N
I[:,None] + J : M, N
Così, l'impostazione finale sarebbe -
a[(I[:,None] + J)%2==0] += 1
Per dirla altro modo con l'intenzione di evitare il confronto con 0
e utilizzare direttamente mod-2
che sarebbe essenzialmente 0
o 1
-
a += (np.arange(a.shape[0])[:,None]-1 + np.arange(a.shape[1]))%2
Si può anche utilizzare np.ix_
per elaborare dispari e poi righe anche per l'impostazione, in questo modo -
a[np.ix_(np.arange(0,a.shape[0],2),np.arange(0,a.shape[1],2))] += 1
a[np.ix_(np.arange(1,a.shape[0],2),np.arange(1,a.shape[1],2))] += 1
potrebbe si prega di aggiungere qualche spiegazione? Aiuterebbe sicuramente i neofiti a capirlo in un modo migliore. – kmario23
Penso che la soluzione 'np.xi_' dovrebbe avere più enfasi; è circa il doppio più veloce. –
@ NicoSchlömer Beh, la trasmissione mi ha colpito prima, quindi sono arrivato in cima :) – Divakar