argmin 方法的返回类型

3 投票
1 回答
1280 浏览
提问于 2025-04-17 23:15

我总是对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 个回答

2

你想要检查一个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'

这有点复杂,可能会让人困惑,但阅读一下 相关文档 可能是个好主意。

撰写回答