exc*_*aza 4 numpy scipy python-3.x
我numpy.loadtext用来从CSV数据文件生成一个结构化的Numpy数组,我希望将其保存到一个MAT文件中给那些比Python更熟悉MATLAB的同事.
样例:
import numpy as np
import scipy.io
mydata = np.array([(1, 1.0), (2, 2.0)], dtype=[('foo', 'i'), ('bar', 'f')])
scipy.io.savemat('test.mat', mydata)
Run Code Online (Sandbox Code Playgroud)
当我尝试scipy.io.savemat在此数组上使用时,会抛出以下错误:
Traceback (most recent call last):
File "C:/Project Data/General Python/test.py", line 6, in <module>
scipy.io.savemat('test.mat', mydata)
File "C:\python35\lib\site-packages\scipy\io\matlab\mio.py", line 210, in savemat
MW.put_variables(mdict)
File "C:\python35\lib\site-packages\scipy\io\matlab\mio5.py", line 831, in put_variables
for name, var in mdict.items():
AttributeError: 'numpy.ndarray' object has no attribute 'items'
Run Code Online (Sandbox Code Playgroud)
我是一个Python新手(充其量),但我假设这是因为savemat设置为处理dicts并且Numpy的结构化数组的结构不兼容.
我可以通过将数据拉入dict来解决此错误:
tmp = {}
for varname in mydata.dtype.names:
tmp[varname] = mydata[varname]
scipy.io.savemat('test.mat', tmp)
Run Code Online (Sandbox Code Playgroud)
哪个加载到MATLAB罚款:
>> mydata = load('test.mat')
mydata =
foo: [1 2]
bar: [1 2]
Run Code Online (Sandbox Code Playgroud)
但这似乎是一种非常低效的方法,因为我复制了内存中的数据.有没有更聪明的方法来实现这一目标?
你可以做到scipy.io.savemat('test.mat', {'mydata': mydata}).
这将创建一个结构mydata与领域foo,并bar在文件中.
或者,您可以在dict理解中打包循环:
tmp = {varname: mydata[varname] for varname in mydata.dtype.names}
Run Code Online (Sandbox Code Playgroud)
我不认为创建一个temprorary字典会复制内存中的数据,因为Python通常只存储引用,而numpy特别试图尽可能地创建原始数据的视图.
| 归档时间: |
|
| 查看次数: |
7546 次 |
| 最近记录: |