我正在使用scipy的loadmat
函数将matlab数据文件加载到python中。
from scipy.io import loadmat
data = loadmat('data.mat')
fields = data['field']
fields
的类型为numpy.ndarray
:
print 'fields type={}'.format(type(fields))
print 'fields dtype={}'.format(fields.dtype)
print 'fields shape={}'.format(fields.shape)
fields type=<type 'numpy.ndarray'> fields dtype=object fields shape=(5,)
我使用nditer
迭代数组:
for x in np.nditer(fields, flags=['refs_ok']):
print 'x={}'.format(x)
print 'x type={}'.format(type(x))
print 'x dtype={}'.format(x.dtype)
print 'x shape={}'.format(x.shape)
break
x=[u'ACE'] x type=<type 'numpy.ndarray'> x dtype=object x shape=()
IndexError:
如果我尝试访问x
的第一个元素,我会获得IndexError
:
x[0]
--------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-102-8c374ae22096> in <module>() 17 print 'type={}'.format(type(x)) 18 print 'dtype={}'.format(x.dtype) ---> 19 x[0] 20 break 21 IndexError: too many indices for array
问题:
type(x)
返回nump.ndarray
,它会说“数组的索引太多了”?x
的内容提取到字符串中?以下是我正在使用的版本:
print 'python version: {}'.format(sys.version)
print 'numpy version: {}'.format(numpy.__version__)
print 'scipy version: {}'.format(scipy.__version__)
python version: 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2] numpy version: 1.11.0 scipy version: 0.17.1
答案 0 :(得分:7)
我没有详细查看你的错误,我可以指出一些陷阱。
.mat将包含MATLAB矩阵(总是2d或更高),单元格和结构。
loadmat
以各种方式呈现这些内容。您必须按名称索引字典。有对象数组(dtype = object)。并且有nd数字或字符串数组。您可能需要通过几个级别来获取数字数组。
检查数组的“形状”(大小)及其“dtype”。如果形状为()
和dtype
对象,则使用y=x[()]
将其提取。
这是一个这样的0d对象数组的例子:
In [4]: y=np.arange(3)
In [5]: x=np.empty((), dtype=object)
In [6]: x[()]=y
In [7]: x
Out[7]: array(array([0, 1, 2]), dtype=object)
In [8]: x.shape
Out[8]: ()
In [9]: x.dtype
Out[9]: dtype('O')
In [10]: x[0]
...
IndexError: too many indices for array
In [11]: x[()]
Out[11]: array([0, 1, 2])
x
是一个0d数组(x.ndim),因此必须使用0元素元组()
建立索引。对于一个看似奇怪的MATLAB程序员。
在numpy
(一般来说是Python)中,x[a,b,c]
与x[(a,b,c)]
和ind=(a,b,c); x[ind]
相同。换句话说,[]
中的参数被理解为值的元组。 (1,2)
是一个2元素元组,(1,)
是一个元素((1)
只是一个分组),()
是一个0元素元组。因此,x[()]
只是常规nd
索引表示法的扩展。这不是特例。