在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从切片返回一个长度为一的对象数组?
答案 0 :(得分:0)
从数据类型对象文档:
“从数组中提取的项目,例如通过索引,将是一个Python对象,其类型是与数组的数据类型相关联的标量类型。
请注意,标量类型不是dtype对象,即使在Numpy中需要数据类型规范时它们也可以代替它们。“
通过使用dtype=np.dtype('object')
,您将创建一个仅使用标量类型填充的numpy数组。 numpy数组定义为:
“同类,并包含由dtype对象描述的元素.dtype对象可以由基本数字类型的不同组合构成。”
答案 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
开发者网站上提出要求。