6

複数の値 < 0 を持つ netcdf ファイルがあります。それらすべてを 1 つの値 (たとえば -1) に置き換えたいと考えています。netCDF4 を使用してそれを行うにはどうすればよいですか? 私はこのようにファイルを読んでいます:

import netCDF4

dset      = netCDF4.Dataset('test.nc')
dset[dset.variables['var'] < 0] = -1
4

4 に答える 4

0

定数のみを使用して計算するのではなく、方程式を使用して条件付き計算を有効にするために、次のように @jhamman によるコードに基づいて、(月、緯度、経度) の形状を持つ変数の条件付き反復を含めました。

import netCDF4 as nc
import numpy as np
import time

Tmin = -1.7
Tmax = 4.9
perc = (Tmax-Tmin)/100

lats = np.arange(0,384,1)
lons = np.arange(0,768,1)
months = [0,1]
dset = nc.Dataset('path/file.nc', 'r+')

start = time.time()
dset['var'][:][dset['var'][:] < Tmin] = 100
step1 = time.time()
print('Step1 took: ' + str(step1-start))
dset['var'][:][dset['var'][:] > Tmax] = 0
step2 = time.time()
print('Step2 took: ' + str(step2 - step1))

#start iteration of each dimension to alter individual values according to equation new_value = 100-((Old_value +1.8)/1%)
for m in months:
    newstart = time.time()
    for i in lats:
        step3 = time.time()
        print('month lats lat layer '+str(i)+' took: '+str(step3-newstart) +'s')
        for j in lons:
            if dset['var'][m,i,j] < Tmax and dset['var'][m,i,j] > Tmin:
                dset['var'][m,i,j] = 100-((dset['var'][m,i,j]+1.8)/perc)       

     end = time.time()
     print('One full month took: ' + str(end-start) +'s')  

dset.close() 

ただし、問題は非常に遅いコードになることです。

Step1 took: 0.0343s
Step2 took: 0.0253s
month lats lat layer: 0.4064s
One full month took 250.8082s

これは反復による論理です。しかし、これを少しスピードアップする方法を知っている人がいるかどうか疑問に思っていました. この目標のために反復は本当に必要ですか?

于 2020-05-11T12:16:19.850 に答える