回答问题

我通过scipy.io.loadmat加载了一个 MATLAB.mat文件,它给了我一个numpy.void对象的列表。

它们是什么,如何使用它们以及我在哪里可以获得一些关于它们的参考文档?

Answers

根据numpy文档:http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html,numpy.void类型被定义为灵活数据类型。基本上,这些数据类型没有与您正在查看的变量关联的预定义类型。如果你看numpy,你有floatuint8boolstring等数据类型。

void是为了适应更通用和更灵活的类型,并且适用于那些不需要属于这些预定义数据类型中的任何一种的数据类型。当您加载struct时,通常会遇到这种情况,其中每个元素都有与多个字段关联的多种数据类型。每个结构元素都可以具有不同数据类型的组合,所有这些数据类型的合并以表示该结构元素的一个实例,因此将我们引向numpy.void

使用文档,您当然可以像使用任何其他数据类型一样执行相同的操作。在此处查看generic数据类型方法:http://docs.scipy.org/doc/numpy/reference/generated/numpy.generic.html#numpy.generic。其实所有的numpy数据类型都是从这个泛型类派生出来的,包括numpy.void

在本文开头提供的第一个链接中,它展示了如何创建自定义记录类型的一个很好的示例,其中记录是数字元组和字符串的组合。在创建这些记录的列表时,列表中的每个类型都是numpy.void类型,它表明记录是这种数据类型。但是,请记住,此记录列表有一个数据类型即此记录,但此列表的每个元素将是numpy.void 类型。


但是,作为自包含问题,让我们在这里重新创建示例:让我们创建一个自定义记录类型,其中它有两个与您创建的每个变量相关联的字段:

  • 一个 16 位字符串,包含一个名为name的字段

  • 浮点数的 2 元素元组,每个 64 位,具有名为grades的字段

因此,您会执行以下操作:

import numpy as np
dt = np.dtype([('name', np.str_, 16), ('grades', np.float64, (2,))])

因此,让我们创建一个包含两个元素的示例列表并实例化它们的字段:

x = np.array([('Sarah', (8.0, 7.0)), ('John', (6.0, 7.0))], dtype=dt)

因为我们把这个列表做成了numpy.array,所以我们期望它的数据类型是这样的:

type(x)

我们得到:

<type 'numpy.ndarray'>

请记住,列表本身是一个numpy.array,但不是单个元素。


要访问此列表的第二个元素,即第二条记录,我们执行以下操作:

x[1]

我们得到:

('John', [6.0, 7.0])

要检查第二条记录的类型,我们这样做:

type(x[1])

我们得到:

<type 'numpy.void'> # As expected

zoz100037 * *

一些额外的奖金给你

要访问第二条记录的名称,我们执行以下操作:

x[1]['name']

我们得到:

'John'

要访问第二条记录的成绩,我们会:

x[1]['grades']

我们得到:

array([ 6.,  7.])

要检查第二条记录中名称的类型,我们执行以下操作:

type(x[1]['name'])

我们得到:

<type 'numpy.string_'>

要检查第二条记录中的等级类型,我们执行以下操作:

type(x[1]['grades'])

我们得到:

<type 'numpy.ndarray'>

请注意,此列表中的每个元素都是numpy.void类型。但是,我们列表中每个元素的各个字段要么是一个数字元组,要么是一个字符串。这些元素的集合numpy.void类型。

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐