【问题标题】:Concatenating numpy.void with numpy.ndarray将 numpy.void 与 numpy.ndarray 连接起来
【发布时间】:2018-03-29 05:38:14
【问题描述】:

(警告 - 我是新手)

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

任何帮助将不胜感激。

【问题讨论】:

  • 这个问题类似:stackoverflow.com/questions/31172991/… 但我仍然得到同样的错误。
  • data.dtype 对我们来说比type 更有用。 concatenate 无法将字段添加到结构化数组。你需要一些石灰recfunctions.append_field(稍后我会查找详细信息)。
  • 谢谢@hpaulj 我已经更新了我的问题。
  • 'O' dtypes 表示字段是对象。检查内容。有时来自 matlab 的加载可能很复杂。它必须翻译外来的东西,比如单元格和结构。

标签: python arrays numpy


【解决方案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 进行了一些尝试-n-error 之后,这可行:

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

【讨论】:

    猜你喜欢
    • 2012-09-07
    • 2017-09-24
    • 2014-08-16
    • 2023-03-29
    • 2020-01-20
    • 2012-03-10
    • 2022-01-19
    • 2013-01-27
    • 2020-10-10
    相关资源
    最近更新 更多