تمديد سلسلة من بيانات NETCDF غير الموحدة في مجموعة numpy
سؤال
أنا جديد على 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)