numpy如何返回一个长度为一个对象数组?

时间:2015-07-09 15:06:50

标签: python numpy

在numpy 1.8.2中,当我索引一个固定长度字符串的numpy数组并请求一个值时,我得到一个长度为1的numpy数组,支持numpy操作。所以:

import numpy as np
strs = np.array(('aa', 'bbb', 'c'), dtype=np.dtype('|S4'))
print type(strs[(0,)])

我得到了

<type 'numpy.string_'>

如果我对一组对象做同样的事情:

strs = np.array(('aa', 'bbb', 'c'), dtype=np.dtype('object'))
print type(strs[(0,)])

我得到了

<type 'str'>

并且任何numpy特定属性/方法(例如.shape)都会返回异常

我如何确保numpy从切片返回一个长度为一的对象数组?

2 个答案:

答案 0 :(得分:0)

从数据类型对象文档:

“从数组中提取的项目,例如通过索引,将是一个Python对象,其类型是与数组的数据类型相关联的标量类型。

请注意,标量类型不是dtype对象,即使在Numpy中需要数据类型规范时它们也可以代替它们。“

通过使用dtype=np.dtype('object'),您将创建一个仅使用标量类型填充的numpy数组。 numpy数组定义为: “同类,并包含由dtype对象描述的元素.dtype对象可以由基本数字类型的不同组合构成。”

Numpy Array Docs

答案 1 :(得分:0)

从技术上讲,strs[(0,)]返回一个0d数组,形状为()

使用列表索引,给出1d数组

In [170]: strs[[0]]
Out[170]: 
array([b'aa'], 
      dtype='|S4')

真正的切片返回相同的内容:strs[0:1]strs[:1]

这些方法也适用于object数组

In [175]: strs1[:1]
Out[175]: array(['aa'], dtype=object)

strs[(0,)]strs[0]相同。事实上,后者是前者的缩写。它从数组中选择一个项目,将维度减少1(例如从1d减少到0d)。

dtype=object是一个奇怪的球案,延伸了正常的numpy行为。因此,在这种情况下它的行为略有不同并不奇怪。是否应该在github开发者网站上提出要求。