تمديد سلسلة من بيانات NETCDF غير الموحدة في مجموعة numpy

StackOverflow https://stackoverflow.com/questions/2642951

  •  27-09-2019
  •  | 
  •  

سؤال

أنا جديد على Python ، أعتذر إذا تم طلب ذلك بالفعل.

باستخدام Python و Numpy ، أحاول جمع البيانات عبر العديد من ملفات NetCDF في مجموعة واحدة عن طريق الاتصال بشكل متكرر append().

بسذاجة ، أحاول أن أفعل شيئًا كهذا:

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)

أعلم أنه في ظل الظروف العادية ، هذه فكرة سيئة ، لأنها تعيد ذاكرة جديدة على كل منها append() يتصل. لكن شيئين يثنيان توظيف X:

1) لا تكون الملفات بنفس الحجم بالضرورة على طول المحور 0 (ولكن يجب أن يكون بنفس الحجم على طول المحاور اللاحقة) ، لذلك سأحتاج إلى قراءة أحجام الصفيف من كل ملف مسبقًا لتخليص الحجم النهائي لـ x.

لكن...

2) من ما يمكنني قوله ، قم بتحميل Pupynere (ووحدات NetCDF الأخرى) الملف بأكمله في الذاكرة عند فتح الملف ، بدلاً من مجرد مرجع (مثل العديد من وحدات NetCDF في البيئة الأخرى). لذلك ، يجب أن أفتح الملفات مرتين.

هناك العديد من الملفات (> 100) كبيرة (> 1 جيجابايت) ، لذا فإن التثبيت بشكل عام وإعادة تشكيله ليس عمليًا ، مما يمكنني قوله.

سؤالي الأول هو ما إذا كنت أفتقد بعض الطرق الذكية للتخلي.

سؤالي الثاني أكثر جدية. يعمل المقتطف أعلاه لمجموعة أحادية البعد. ولكن إذا حاولت التحميل في مصفوفة ، يصبح التهيئة مشكلة. يمكنني إلحاق صفيف أحادي البعد إلى صفيف فارغ:

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

لكن لا يمكنني إلحاق مجموعة فارغة إلى مصفوفة:

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

أعتقد أن هناك شيئًا مثل X.Extend (xfragment) ، لكنني لا أعتقد أن صفائف Numpy لها هذه الوظيفة. يمكنني أيضًا تجنب مشكلة التهيئة من خلال التعامل مع الملف الأول كحالة خاصة ، لكنني أفضل تجنب ذلك إذا كانت هناك طريقة أفضل للقيام بذلك.

إذا كان بإمكان أي شخص تقديم المساعدة أو اقتراحًا ، أو يمكنه تحديد مشكلة في مقاربي ، فسأكون ممتنًا. شكرًا

هل كانت مفيدة؟

المحلول

يمكنك حل المشكلتين عن طريق تحميل المصفوفات أولاً من ملفات الملفات إلى قائمة من المصفوفات ، ثم باستخدام سلسل للانضمام إلى جميع المصفوفات. شيء من هذا القبيل:

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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top