如何确定 numpy 对象 dtype 中的基础类型?



如果我有一个自定义的python类,并在numpy.ndarray中使用它,我的数组以dtype 'O'(对象(结束,这很好:

import numpy
class Test(object):
"""Dummy class
"""
def __init__(self, value):
self.value = value
def __float__(self):
return float(self.value)

arr = numpy.array([], dtype=Test)

这给了我array([], dtype=object),但是我如何解开 dtype 以检查底层类型是否Test

当数组中有元素时,这很容易,因为我可以在任何成员上使用isinstance,但是当数组为空时,我被难住了。我希望底层类型存储在 dtype 中的某个地方......

你不能。数组并不意味着与非基元类型一起使用(有效地(,并且实际上与(非常慢的(列表没有什么不同。事实上,一旦你去对象,你可以把任何你想要的东西放到数组中:

array((Test(),[])) #works fine, dtype object. Even explicitly setting dtype will not fail, and be ignored.

如您所见 - 如果您不放置可以转换为的基元numpy,则不会执行任何类型强制。

虽然我根本不推荐数组,但如果你能保证数组包含单一类型,那么

type(arr[0])

确实是您唯一的选择(当然取决于形状(。

type(ar.reshape(-1)[0])

形状独立,假设它不是异构的,它是一个视图,所以不需要额外的内存。