如何访问numpy ndarray元素?

5
我正在使用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=()

索引错误:

如果我尝试访问x的第一个元素,会出现索引错误

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,为什么会显示 "too many indices for array"?
  • 如何将 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

你能打印出 x.shape 吗? - C_Z_
@C_Z_ - 更新了问题以包括 x.shape,它返回 () - Steve Lorimer
1
这是一个0维数组,你必须使用0元组索引它,x[()]。请看我的答案。 - hpaulj
1个回答

10

我可以简要指出一些错误的风险,但不会详细说明。

.mat文件包含MATLAB矩阵(始终是2D或更高维)、单元和结构体。

loadmat以各种方式呈现这些内容。有需要按名称索引的字典,有对象数组(dtype=object),还有nd数值或字符串数组。您可能需要通过多个级别来获取数值数组。

检查数组的“形状”(大小)和它的“dtype”。如果“shape”为()并且“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 是一个0维数组 (x.ndim),因此它必须使用一个0元素的元组()来进行索引。对于MATLAB程序员来说,这可能看起来有点奇怪。

numpy(一般指Python)中,x[a,b,c]x[(a,b,c)]ind=(a,b,c); x[ind]等价。换句话说,[]中的参数被理解为一个值的元组。 (1,2)是一个包含两个元素的元组,(1,)是一个包含一个元素的元组((1)只是分组),()是一个0元素的元组。因此,x[()]只是常规nd索引符号的扩展,它不是一个特殊情况。


谢谢,使用数组索引符号(x[()])起作用了。你有什么资源可以让我了解这个符号吗?我以前从未见过。 - Steve Lorimer
1
我在这个符号上添加了一段文字。 - hpaulj
3
x.item() 是提取单个元素的另一种方式。 - hpaulj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接