Pergunta

Eu sou novo no Python, desculpas se isso já foi pedido.

Usando Python e Numpy, estou tentando coletar dados em muitos arquivos NetCDF em uma única matriz chamando iterativamente append().

Ingenuamente, estou tentando fazer algo assim:

from numpy import *
from pupynere import netcdf_file

x = array([])
y = [...some list of files...]

for file in y:
    ncfile = netcdf_file(file,'r')
    xFragment = ncfile.variables["varname"][:]
    ncfile.close()
    x = append(x, xFragment)

Eu sei que, em circunstâncias normais, isso é uma má idéia, pois realoca nova memória em cada append() ligar. Mas duas coisas desencorajam a pré -allocação de x:

1) Os arquivos não são necessariamente do mesmo tamanho ao longo do eixo 0 (mas devem ter o mesmo tamanho ao longo dos eixos subsequentes), então eu precisaria ler os tamanhos da matriz de cada arquivo antes para pré -calcular o tamanho final de x.

No entanto...

2) Pelo que posso dizer, o Pupynere (e outros módulos NetCDF) carrega o arquivo inteiro na memória ao abrir o arquivo, em vez de apenas uma referência (como muitos módulos NETCDF em outros ambientes). Então, para pré -alocar, eu teria que abrir os arquivos duas vezes.

Existem muitos arquivos (> 100) grandes (> 1 GB), portanto, a conclusão geral e a remodelação não é prática, pelo que posso dizer.

Minha primeira pergunta é se estou perdendo uma maneira inteligente de pré -realocar.

Minha segunda pergunta é mais séria. O snippet acima funciona para uma matriz de dimensão única. Mas se eu tentar carregar em uma matriz, a inicialização se tornará um problema. Eu posso anexar uma matriz unidimensional a uma matriz vazia:

append( array([]), array([1, 2, 3]) )

Mas não posso anexar uma matriz vazia a uma matriz:

append( array([]), array([ [1, 2], [3, 4] ]), axis=0)

Algo como X.Extend (Xfragment) funcionaria, acredito, mas não acho que as matrizes numpy tenham essa funcionalidade. Eu também poderia evitar o problema de inicialização, tratando o primeiro arquivo como um caso especial, mas prefiro evitar isso se houver uma maneira melhor de fazê -lo.

Se alguém puder oferecer ajuda ou sugestão, ou identificar um problema com minha abordagem, ficaria agradecido. Obrigado

Foi útil?

Solução

Você pode resolver os dois problemas carregando primeiro as matrizes dos arquivos de arquivos em uma lista de matrizes e depois usando concatenar Para se juntar a todas as matrizes. Algo assim:

x = [] # a normal python list, not np.array
y = [...some list of files...]

for file in y:
    ncfile = netcdf_file(file,'r')
    xFragment = ncfile.variables["varname"][:]
    ncfile.close()
    x.append(xFragment)

combined_array = concatenate(x, axis=0)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top