(警告 - 我是新手)
我使用scipy.io导入了mat文件:
data = spio.loadmat('data.mat', struct_as_record=True, squeeze_me=True)
data = data['b']
>>> <type 'numpy.void'>
这给了我一个numpy.void类型的文件。每行有17个条目,类型为string,float,array
print(data.shape)
>>> (11000,)
我有另一个字符串列表,我将其转换为numpy.array:
filenames = np.array([filenames])
filenames = np.ndarray.flatten(filenames)
print (filenames.shape)
>>> (11000,)
print(data.dtype)
print(filenames.dtype)
>>> [('fieldname1', 'O'), ('fieldname2', 'O'), ('fieldname3', 'O'), ('fieldname4', 'O'), ('fieldname5', 'O'), ('fieldname6', 'O'), ('fieldname7', 'O'), ('fieldname8', 'O'), ('fieldname9', 'O'), ('fieldname10', 'O'), ('fieldname11', 'O'), ('fieldname12', 'O'), ('fieldname13', 'O'), ('fieldname14', 'O'), ('fieldname15', 'O'), ('fieldname16', 'O'), ('fieldname17', 'O')]
>>> |S16
我想在列中连接这些:
NEW = np.concatenate((data, filenames), axis=1)
但是我收到了这个错误:
>>> TypeError: invalid type promotion
非常感谢任何帮助。
答案 0 :(得分:1)
recfunctions
是一个模块,其中包含用于摆弄结构化数组(及其变体recarray
)的工具。它需要单独导入。根据我的经验,它也有些错误。
In [158]: from numpy.lib import recfunctions
创建一个包含多个对象dtype字段的数组:
In [159]: dat = np.empty((3,),dtype=('O,O,O'))
In [160]: dat
Out[160]:
array([(None, None, None), (None, None, None), (None, None, None)],
dtype=[('f0', 'O'), ('f1', 'O'), ('f2', 'O')])
在调用append_field
后出现一些试验错误,这有效:
In [161]: names = np.array(['one','two','three'])
In [162]: dat1 = recfunctions.append_fields(dat, 'names', names, usemask=False)
In [163]: dat1
Out[163]:
array([(None, None, None, 'one'), (None, None, None, 'two'),
(None, None, None, 'three')],
dtype=[('f0', 'O'), ('f1', 'O'), ('f2', 'O'), ('names', '<U5')])
但是检查从MATLAB加载的数据的内容。 .mat可能包含结构和单元格,loadmat
必须转换为numpy
等价物。为此,它广泛使用了对象dtype数组。