argmin 方法的返回类型
我总是对numpy的数据类型感到困惑。
假设我定义了一个numpy数组:
>>> a = np.array([1.,2.,3.])
在代码的某个地方,我想知道是否是一个numpy数组,而不是其他类型的数据。下面的代码可以告诉我答案:
>>> print type(a)
<type 'numpy.ndarray'>
我是在iPython中执行的。看起来返回的是一个“类型”的对象,但我不知道该如何在程序中处理“类型”对象。我也可以用isinstance来确认是一个numpy数组:
>>> isinstance(a, np.ndarray)
True
(顺便问一下:我该如何返回一个容易理解的对象来弄清楚是什么?文档说type返回一个对象的类型,但对象的类型是什么呢?它既不是字符串,也不是数字,而是一种对象。我似乎可以把类型对象转换成字符串,然后用split()来解析,但这听起来有点危险。关于“类型”对象的文档是否足够详细,以保证我传给str时能得到一个可以标准解析的东西?)
回到主要问题。
我现在在上使用argmin方法:
>>> f = a.argmin()
我原以为f的类型是整数,但实际上不是。例如:
>>> type(3)
int
返回的是“int”。但是type f返回:
>>> type(f)
numpy.int32
我不知道numpy.int32这个答案告诉我什么。它不是一个numpy数组:
>>> isinstance(f, np.ndarray)
False
但f也不是一个整数。那它是什么呢?这很重要,因为我把这个numpy.int32对象传给了一个函数,结果搞得一团糟。当我先转换成int,再传给函数时,一切都正常。显然,函数需要的是一个int,但我却传了一个numpy.int32,结果就出错了。
argmin()方法的文档说明它返回“索引”。我不太确定这是什么。我原以为它会是一个整数,或者是一个整数的numpy数组。但“索引”既不是。它是这个“numpy.int32”的东西。那到底是什么呢?
谢谢你的帮助。
(顺便讨论继续:我仍在寻找一个numpy函数或方法,能以某种容易理解的形式返回一个对象的类型。type返回的是“类型”的对象,但我不知道如何写程序来查询类型对象。我真的不知道类型对象是什么,或者如何与之互动。如果有一个numpy函数能返回简单的信息,比如“这是一个浮点数的numpy数组”或者“这是一个标量浮点数”或者“这是一个numpy.int32”(不管那是什么),那就太好了。我还没有找到实现这个的方法)。
1 个回答
你想要检查一个numpy数组的 .dtype
属性。如果你想让人理解这些结果,比如 np.int32
就表示“32位的numpy整数类型”。如果你想通过程序来了解这些信息,最好的办法可能是使用 np.typecodes
:
>>> np.typecodes
{'All': '?bhilqpBHILQPefdgFDGSUVOMm', 'Complex': 'FDG', 'AllFloat': 'efdgFDG',
'Integer': 'bhilqp', 'UnsignedInteger': 'BHILQP', 'Float': 'efdg',
'Character': 'c', 'Datetime': 'Mm', 'AllInteger': 'bBhHiIlLqQpP'}
这些代码代表了不同的数据类型:
>>> for t in np.typecodes['UnsignedInteger']:
... print(np.dtype(t).name)
...
uint8
uint16
uint32
uint32
uint64
uint64
注意,比如 np.dtype(...)
返回的结果和如果 a
是那种类型的ndarray时 a.dtype
返回的结果是一样的。
最后,如果你只是想检查它是整数还是浮点数,可以查看dtype的 .kind
属性,它也会返回一个单一的字符:
>>> np.dtype(np.float32).kind
'f'
>>> np.dtype(np.int32).kind
'i'
>>> np.dtype(np.uint32).kind
'u'
>>> np.dtype(np.bool).kind
'b'
这有点复杂,可能会让人困惑,但阅读一下 相关文档 可能是个好主意。