【问题标题】:Python check dtype of array - float or complexPython检查数组的dtype - 浮点数或复数
【发布时间】:2019-11-18 00:52:35
【问题描述】:

如果是 float 或 complex dtype,我如何检查 numpy 数组?对于简单的示例,以下检查都可以正常工作。

# these are True
a = np.zeros(10)
a.dtype == float
a.dtype == np.float
a.dtype == np.float64

b = np.zeros(10,dtype=complex)
b.dtype == complex
b.dtype == np.complex
b.dtype == np.complex128

但是,我有一个 dtype 数组 dtype('>f8')。之前的比较都没有将其识别为浮点数组。据我所知,字节顺序(> vs.

【问题讨论】:

  • np.iscomplexobj 测试typedtype: issubclass(arr.dtype.type, np.complexfloating)。基本 dtype 有几个级别的子类,所以简单的 '==' 测试并不总是有效。

标签: python arrays numpy types


【解决方案1】:

你试过numpy.isrealobj()np.iscomplexobj()吗?

你的例子:

import numpy as np

a = np.zeros(10)
print(np.isrealobj(a)) # -> True
print(np.iscomplexobj(a)) # -> False

b = np.zeros(10,dtype=complex)
print(np.isrealobj(b)) # -> False
print(np.iscomplexobj(b)) # -> True

c=np.zeros(10, dtype='>f8')
print(np.isrealobj(c)) # -> True
print(np.iscomplexobj(c)) # -> False

np.isrealobj(x) 的文档状态:

如果 x 不是复数类型或复数数组,则返回 True。

检查的是输入的类型,而不是值。所以即使输入 虚部为零,isrealobj 计算结果为 False 如果数据类型很复杂。

也可以按值检查:np.isrealnp.iscomplex

这有帮助吗?

【讨论】:

  • 绝对有帮助,即使是空数组,感谢您的建议。
  • 如果您对我的回答完全满意,请考虑接受。谢谢!
【解决方案2】:

您可以将all() 函数与isinstance() 函数结合使用。

如果列表的所有元素都为真,all() 函数将返回 True,并且您可以使用 isinstance() 检查 numpy 数组中的每个数字是否都是浮点数。由于 isinstance() 将 '>f8' 视为浮点数,因此比较不会引发您遇到的问题。

这是它的样子:

b = np.zeros(10,dtype='>f8')
all(isinstance(x, float) for x in b)

输出:

True

【讨论】:

  • 也许你应该解释为什么程序不应该测试type(b[0]) == float 或类似的东西。无论如何 +1。
  • 是否也有空数组的解决方案,即np.array([])?只是出于好奇...
  • 使用np.isrealobj() 也适用于空数组:np.isrealobj(np.array([])) 为真,np.isrealobj(np.array([], dtype=complex)) 为假。
  • @bproxauf all(b) 如果 b 为空,则在 true 时返回 true,仅使用 all 函数就无法解决此问题。但是您可以添加类似all(b) and len(b) != 0 的条件以获得适当的结果
  • 检查数组所有元素的类型并不是一个好主意:numpy保证所有元素都具有相同的类型(对象数组除外),这也是numpy性能下降的主要原因来自。
猜你喜欢
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 2020-10-12
相关资源
最近更新 更多