Объединить в "для цикла" - PullRequest
0 голосов
/ 28 октября 2018

У меня есть 2 файла netCDF (называемые 1.nc и 2.nc) в каталоге (скажем, dir). Поскольку оба они идентичны, у меня есть функция для чтения переменной, которую я хочу получить от каждого:

varA = myfunction(1.nc)
varB = myfunction(2.nc)

где я печатаю:

varA.shape 
varB.shape

и я получаю размеры (как для varA, так и для varB):

(31,180,360)

Теперь я объединяю их с:

BB = np.concatenate((varA,varB))

и я получаю размеры:

BB.shape
(62,180,360)

что я и хочу.

Но, если я пытаюсь выполнить ту же работу автоматически (в случае, если у меня есть 50 похожих файлов) в цикле for, я пишу:

for fname in sorted(glob.glob(dir +'*.nc')):
    print fname
    BB = np.concatenate((myfunction(fname)),axis=0)

Оператор print дает 1.nc и 2.nc (как и ожидалось) и

myfunction (fname) - это чтение переменной, которую я хочу, с размерами (31,180,360), как раньше. После цикла я получаю BB с размерами:

BB.shape
[5580, 360]

Есть идеи почему?

Большое спасибо !!!

1 Ответ

0 голосов
/ 28 октября 2018

Проблема в том, что вы ничего не объединяете вместе со своим np.concatenate вызовом. Вы перезаписываете только то, что хранится в BB каждый раз в цикле с каждым fname в вашей коллекции.

Что вам нужно сделать, это передать BB в свою конкатенацию, чтобы вы продолжали добавлять к ней.

BB = np.empty([0, 180, 360])  # Init BB as empty array with correct shape

for fname in sorted(glob.glob(dir +'*.nc')):
    print fname
    BB = np.concatenate((BB, myfunction(fname)), axis=0)  # Concat together BB and myfunction call

Я не слишком знаком с numpy, поэтому создание пустой части массива может иметь неправильный формат, соответствующий форме ваших данных. Так что измените его так, чтобы оно соответствовало формату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...