如何识别Python中的numpytypes?

如何可靠地确定一个对象是否具有numpytypes?

我意识到这个问题违背了鸭子打字的哲学,但是想法是确保一个函数(它使用scipy和numpy)从不返回一个numpytypes,除非它被称为一个numpytypes。 这出现在另一个问题的解决scheme中,但是我认为确定一个对象是否具有numpytypes的一般问题远离原始问题,应该将它们分开。

使用内buildtype函数来获取types,然后可以使用__module__属性找出它的定义:

 >>> import numpy as np a = np.array([1, 2, 3]) >>> type(a) <type 'numpy.ndarray'> >>> type(a).__module__ 'numpy' >>> type(a).__module__ == np.__name__ True 

我提出的解决scheme是:

 isinstance(y, (np.ndarray, np.generic) ) 

但是, 并不是100%清楚所有numpytypes都是np.ndarraynp.generic ,这可能不是版本健壮的。

要获得types,请使用内置type函数。 使用in运算符,可以通过检查它是否包含stringnumpy来testingtypes是否为numpytypes;

 In [1]: import numpy as np In [2]: a = np.array([1, 2, 3]) In [3]: type(a) Out[3]: <type 'numpy.ndarray'> In [4]: 'numpy' in str(type(a)) Out[4]: True 

(顺便说一下,这个例子是在IPython中运行的,非常适合交互式使用和快速testing。)

老问题,但我拿出一个明确的答案与一个例子。 因为我有这个相同的问题,不能伤害到保持新鲜的问题,没有find明确的答案。 关键是要确保你有numpy导入,然后运行isinstance bool。 虽然这看起来很简单,但是如果你正在做一些跨不同数据types的计算,这个小小的检查可以作为一个快速testing,然后开始一些numpyvector化操作。

 ################## # important part! ################## import numpy as np #################### # toy array for demo #################### arr = np.asarray(range(1,100,2)) ######################## # The instance check ######################## isinstance(arr,np.ndarray) 

这实际上取决于你在找什么。

  • 如果你想testing一个序列是否实际上是一个ndarray ,那么isinstance(..., np.ndarray)可能是最简单的。 确保你不要在后台重新加载numpy,因为这个模块可能不同,但是否则你应该没问题。 MaskedArraysmatrixrecarray都是recarray的子类,所以你应该设置。
  • 如果你想testing一个标量是否是一个numpy标量,事情会变得复杂一些。 你可以检查它是否有一个shape和一个dtype属性。 您可以将它的dtype与基本dtypes进行比较,您可以在np.core.numerictypes.genericTypeRankfind它的列表。 请注意,这个列表中的元素是string,所以你必须做一个tested.dtype is np.dtype(an_element_of_the_list)
Interesting Posts