用numpy.ndarray连接numpy.void

时间:2017-10-17 13:42:31

标签: python arrays numpy

(警告 - 我是新手)

我使用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

非常感谢任何帮助。

1 个答案:

答案 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数组。