我通过.mat
加载了一个MATLAB scipy.io.loadmat
文件,它给了我一个numpy.void
个对象的列表。
有人可以告诉我它们是什么,如何使用它们以及在哪里可以获得一些文档?
答案 0 :(得分:54)
根据numpy
文档:http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html,numpy.void
类型被定义为灵活数据类型。基本上,这些是数据类型,其中没有与您正在查看的变量关联的预定义类型。如果您查看numpy
,则表示您拥有float
,uint8
,bool
,string
等数据类型。
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
类型。< / p>
然而,作为自我遏制的问题,让我们在这里重新创建示例:让我们创建一个自定义记录类型,其中有两个字段与您创建的每个变量相关联:
name
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
要访问第二条记录的名称,我们会这样做:
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
类型。