是否可以在numpy.linalg中强制执行整数运算?

问题描述 投票:0回答:2

如果使用np.linalg.solve求解线性方程,则结果为dtype=float

虽然对于“小”整数没问题,但大数会导致错误的结果:

import numpy as np
A = np.array([[1000000000000,2000000],[3000000000000,4000000]])
x = np.array([1000000,2000000])
np.linalg.solve(A, A @ x)

结果

array([1000000.      , 1999999.999872])

我的问题不是,为什么会发生错误,我知道。我也知道numpy整数的限制由C整数确定。

但是,[np.linalg中是否有使用/强制使用大整数(r)的方法?

我发现了这个:Stocking large numbers into numpy array,但是这在np.linalg.solve中不起作用:

/usr/lib/python3/dist-packages/numpy/linalg/linalg.py in solve(a, b)
    401     signature = 'DD->D' if isComplexType(t) else 'dd->d'
    402     extobj = get_linalg_error_extobj(_raise_linalgerror_singular)
--> 403     r = gufunc(a, b, signature=signature, extobj=extobj)
    404 
    405     return wrap(r.astype(result_t, copy=False))

TypeError: No loop matching the specified signature and casting
was found for ufunc solve1
python python-3.x numpy largenumber
2个回答
1
投票
使用LAPACK例程_gesv计算解。

BLAS / LAPACK都是关于浮点计算的!商业实现(例如Intels MKL)可能支持某些基于整数的功能,并且OpenBLAS上的experimental branch非常有限。

但是numpy支持多个BLAS / LAPACK后端,因此仅支持所有地方都支持的后端。这些是基于浮点的操作。

出于好奇,您可能会在umath_linalg.c.src中阅读了一些易于识别的类型。拥有这些

typed source-code

很容易看到,为什么某些基于

np.object的数组不起作用。


0
投票
使用LAPACK例程_gesv计算解。

BLAS / LAPACK都是关于浮点计算的!商业实现(例如Intels MKL)可能支持某些基于整数的功能,并且OpenBLAS上的experimental branch非常有限。

但是numpy支持多个BLAS / LAPACK后端,因此仅支持所有地方都支持的后端。这些是基于浮点的操作。

出于好奇,您可能会在umath_linalg.c.src中阅读了一些易于识别的类型。拥有这些

typed source-code

很容易看到,为什么某些基于

np.object的数组不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.