gpt4 book ai didi

python - 如何有效地检查 numpy 数组是否可以转换为另一种整数类型?

转载 作者:太空宇宙 更新时间:2023-11-04 05:16:22 25 4
gpt4 key购买 nike

假设我有一个整数类型的 numpy 数组(比如 np.int64),我想将它转换为另一种类型(比如 np.int8)。如何最有效地检查操作是否安全(保留所有值)?

我想到了两种方法:

方法一:使用类型信息

def is_safe(data, new_type):
if np.can_cast(data, new_type):
return True # Handle the trivial allowed cases
type_info = np.iinfo(new_type)
return np.all((data >= type_info.min) & (data <= type_info.max))

方法 2:对所有项目使用 np.can_cast

def is_safe(data, new_type):
if np.can_cast(data, new_type):
return True # Handle the trivial allowed cases
return all(np.can_cast(item, new_type) for item in np.nditer(item))

这两种方法似乎都是有效的(并且适用于微不足道的情况),但它们是否正确且有效?还有其他更好的方法吗?

附言更复杂的是,np.can_cast(np.int8, np.uint64) 返回 False(自然地),因此必须分别检查有符号和无符号整数之间的变化。

最佳答案

如果您已经知道数组是 NumPy 整数类型,那么唯一需要检查的是这些值是否在目标整数范围的最小值/最大值指定的范围内。这是一个比通用 can_cast 简单得多的检查,它没有关于它所提供的东西的先验知识。因此,can_cast 需要更长的时间。我在将整数 0-99 从 np.int64 转换为 np.int8 时对此进行了测试。

因此,虽然这两种方法都是正确的,但如果您知道 data 是 NumPy 整数数组,则第一种方法更可取。

>>> timeit.timeit("np.all((data >= type_info.min) & (data <= type_info.max))", setup="import numpy as np\ndata = np.array(range(100), dtype=np.int64)\ntype_info = np.iinfo(np.int8)")
6.745509549000417
>>> timeit.timeit("all(np.can_cast(item, np.uint8) for item in np.nditer(data))", setup="import numpy as np\ndata = np.array(range(100), dtype=np.int64)")
51.0065170609887

将最小值和最大值分配给新变量的速度稍快(20% 左右):

type_info = np.iinfo(new_type)
a = type_info.min
b = type_info.max
return np.all((data >= a) & (data <= b))

关于python - 如何有效地检查 numpy 数组是否可以转换为另一种整数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41617110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com