/ / Python: come aumentare le dimensioni di una matrice senza espanderla? - python, matrici, python-3.x, numpy, concatenazione

Python: come aumentare le dimensioni di una matrice senza espanderla? - python, matrici, python-3.x, numpy, concatenazione

Sono abbastanza nuovo in Python, e sono attualmentelavorando su un codice in cui voglio memorizzare le iterazioni precedenti di una matrice tridimensionale, una versione della quale viene creata in ogni singolo passo di un ciclo for. Il modo in cui voglio fare questo è concatenare una nuova matrice di dimensione 3 + 1 = 4, che memorizza i valori precedenti. Ora questo è possibile con la concatenazione, e ho capito che funziona così:

import numpy as np

matrix = np.ones((1,lay,row,col), dtype=np.float32)

for n in range(100):
if n == 0:
# initialize the storage matrix
matrix_stored = matrix
else:
# append further matrices in first dimension
matrix_stored = np.concatenate((matrix_stored,matrix),axis = 0)

quindi ecco la mia domanda: il codice sopra richiede che la matrice sia già nella struttura quadridimensionale [1 x m x n x o]. Per i miei scopi, tuttavia, preferirei mantenere la matrice variabile tridimensionale [m x n x o], e trasformarla solo in una forma quadridimensionale quando la alimentiamo nella variabile matrix_stored.

C'è un modo per facilitare tale conversione?

risposte:

3 per risposta № 1

Potresti considerare l'utilizzo np.reshape. In particolare, al punto di passare la matrice alla funzione, la rimodellerai in questo modo:

your_function(matrix.reshape(1, *matrix.shape))

Dove matrix.shape stampa le dimensioni esistenti della tua matrice.


1 per risposta № 2

Per rispondere alla tua domanda: un modo abbreviato per aggiungere una dimensione con lunghezza 1 è indicizzare con None

np.concatenate((matrix_stored,matrix[None]),axis = 0)

Ma più di tutto mi piace avvertirti di non concatenare gli array in un ciclo. Confronta questi tempi:

In [31]: %%timeit
...: a = np.ones((1,1000))
...: A = a.copy()
...: for i in range(1000):
...:     A = np.concatenate((A, a))
1 loop, best of 3: 1.76 s per loop

In [32]: %timeit a = np.ones((1000,1000))
100 loops, best of 3: 3.02 ms per loop

Questo succede perché concatenate copia i dati dagli array sorgente in un array completamente nuovo. E ogni iterazione del ciclo è necessario copiare sempre più dati.

È meglio allocare in anticipo:

In [33]: %%timeit
...: A = np.empty((1000, 1000))
...: a = np.ones((1,1000))
...: for i in range(1000):
...:     A[i] = a
100 loops, best of 3: 3.42 ms per loop