gpt4 book ai didi

python - 如何避免 Numpy 类型转换?

转载 作者:行者123 更新时间:2023-11-28 18:56:24 24 4
gpt4 key购买 nike

对于从整数和 32 位 float 组64 位 float 组 的自动 Numpy 类型转换,是否可以避免或发出警告?

我的用例是我正在开发一个大型分析包(20k 行 Python 和 Numpy),目前混合使用 float 32 和 64 以及一些 int dtypes,很可能导致性能欠佳和浪费内存,基本上我想在任何地方始终如一地使用 float32。

我知道在 Tensorflow 中组合两个不同 dtype 的数组会产生错误 - 正是因为隐式转换为 float64 会导致性能不佳并且在所有计算的张量上“传染”并且很难找到在哪里如果隐式完成,它会被引入。

在 Numpy 中寻找一个选项或一种猴子修补 Numpy 的方法,以便它在这方面表现得像 Tensorflow,即在 np.add 等操作的隐式类型转换上发出错误,np.mul 等,甚至更好,发出带有打印回溯的警告,以便执行继续,但我看到它发生的地方。可能吗?

最佳答案

免责声明:我没有以任何严肃的方式对此进行测试,但这似乎是一条很有前途的路线。

操纵 ufunc 行为的一种相对轻松的方式似乎是 subclassing ndarray并覆盖 __array_ufunc__。例如,如果您满足于捕捉任何产生 float64

的东西
class no64(np.ndarray):
def __array_ufunc__(self, ufunc, method, *inputs, **kwds):
ret = getattr(ufunc, method)(*map(np.asarray,inputs), **kwds)
# some ufuncs return multiple arrays:
if isinstance(ret,tuple):
if any(x.dtype == np.float64 for x in ret):
raise ValueError
return (*(x.view(no64) for x in ret),)
if ret.dtype == np.float64:
raise ValueError
return ret.view(no64)

x = np.arange(6,dtype=np.float32).view(no64)

现在让我们看看我们的类可以做什么:

x*x
# no64([ 0., 1., 4., 9., 16., 25.], dtype=float32)
np.sin(x)
# no64([ 0. , 0.84147096, 0.9092974 , 0.14112 , -0.7568025 ,
# -0.9589243 ], dtype=float32)
np.frexp(x)
# (no64([0. , 0.5 , 0.5 , 0.75 , 0.5 , 0.625], dtype=float32), no64([0, 1, 2, 2, 3, 3], dtype=int32))

现在让我们将它与 64 位参数配对:

x + np.arange(6)
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# File "<stdin>", line 9, in __array_ufunc__
# ValueError

np.multiply.outer(x, np.arange(2.0))
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# File "<stdin>", line 9, in __array_ufunc__
# ValueError

什么不起作用(我敢肯定还有更多)

np.outer(x, np.arange(2.0))  # not a ufunc, so slips through
# array([[0., 0.],
# [0., 1.],
# [0., 2.],
# [0., 3.],
# [0., 4.],
# [0., 5.]])

__array_function__ 似乎是捕捉这些的原因。

关于python - 如何避免 Numpy 类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57982230/

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