إنشاء هيكل مصفوفة ثلاثية الأبعاد والكتابة في ملف mat في بايثون
سؤال
أنا جديد جدًا على بايثون.أحتاج إلى مصفوفة ثلاثية الأبعاد، من أجل حفظ مصفوفة 8 × 8 في بعض الطول.دعنا نتصل بالرقم 530.المشكلة هي أنني استخدمت np.array نظرًا لأن المصفوفة لا يمكن أن تحتوي على أكثر من بعدين كما يقول numpy.
R = zeros([8,8,530],float)
لقد حسبت مصفوفتي 8 × 8 باعتبارها np.matrix
R[:,:,ii] = smallR
وبعد ذلك أحاول حفظه في ملف mat كما يدعي scipy أنه يفعل ذلك.
sio.savemat('R.mat',R)
ومع ذلك، يظهر خطأ يقول أن الكائن "numpy.ndarray" لا يحتوي على سمة "عناصر"
/usr/local/lib/python2.7/dist-packages/scipy/io/matlab/mio.py:266: FutureWarning: Using oned_as default value ('column') This will change to 'row' in future versions
oned_as=oned_as)
Traceback (most recent call last):
File "ClassName.py", line 83, in <module>
print (buildR()[1])
File "ClassName.py", line 81, in buildR
sio.savemat('R.mat',R)
File "/usr/local/lib/python2.7/dist-packages/scipy/io/matlab/mio.py", line 269, in savemat
MW.put_variables(mdict)
File "/usr/local/lib/python2.7/dist-packages/scipy/io/matlab/mio5.py", line 827, in put_variables
for name, var in mdict.items():
AttributeError: 'numpy.ndarray' object has no attribute 'items'
المحلول
إذا كتبت help(sio.savemat)
, ، هل ترى:
savemat(file_name, mdict, appendmat=True, format='5', long_field_names=False, do_compression=False, oned_as=None)
Save a dictionary of names and arrays into a MATLAB-style .mat file.
[...]
mdict : dict
Dictionary from which to save matfile variables.
وهكذا حتى لو كنت لا تتعرف .items()
كطريقة قاموس، من الواضح أننا سنحتاج إلى استخدام قاموس (مجموعة من المفاتيح وأزواج القيمة؛جوجل "برنامج تعليمي لقاموس بايثون" إذا لزم الأمر).
في هذه الحالة:
>>> from numpy import zeros
>>> from scipy import io as sio
>>>
>>> R = zeros([8,8,530],float)
>>> R += 12.3
>>>
>>> sio.savemat('R.mat', {'R': R})
>>>
>>> S = sio.loadmat('R.mat')
>>> S
{'R': array([[[ 12.3, 12.3, 12.3, ..., 12.3, 12.3, 12.3],
[ 12.3, 12.3, 12.3, ..., 12.3, 12.3, 12.3],
[ 12.3, 12.3, 12.3, ..., 12.3, 12.3, 12.3],
...,
...,
[ 12.3, 12.3, 12.3, ..., 12.3, 12.3, 12.3],
[ 12.3, 12.3, 12.3, ..., 12.3, 12.3, 12.3],
[ 12.3, 12.3, 12.3, ..., 12.3, 12.3, 12.3]]]), '__version__': '1.0', '__header__': 'MATLAB 5.0 MAT-file Platform: posix, Created on: Sat Feb 25 18:16:02 2012', '__globals__': []}
>>> S['R']
array([[[ 12.3, 12.3, 12.3, ..., 12.3, 12.3, 12.3],
[ 12.3, 12.3, 12.3, ..., 12.3, 12.3, 12.3],
[ 12.3, 12.3, 12.3, ..., 12.3, 12.3, 12.3],
...,
...,
[ 12.3, 12.3, 12.3, ..., 12.3, 12.3, 12.3],
[ 12.3, 12.3, 12.3, ..., 12.3, 12.3, 12.3],
[ 12.3, 12.3, 12.3, ..., 12.3, 12.3, 12.3]]])
في الأساس، يتم استخدام القاموس حتى يمكن تسمية المصفوفات، كما يمكنك تخزين كائنات متعددة في ملف .mat واحد.