如果我有一个自定义的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])
形状独立,假设它不是异构的,它是一个视图,所以不需要额外的内存。