python 整数的 numpy 默认数据类型

numpy default dtype for python integer

我有遗留 windows numpy 代码,其中有很多 nd.array 没有显式 dtype 的整数。在 windows 中,它们被视为 np.int32。移动到 linux,它们变成了 np.int64,这会导致很多类型问题。

与其在代码中的许多地方添加显式数据类型,

我能否以某种方式强制 linux 64 上的 numpy 将整数视为 np.int32 而不是 np.int64。 例如:np.array(1) 将变为 np.int32.

我看到它在 中被问到,~两年前,我想知道从那以后是否有什么改变。

遗留代码的一个变通方法可能是数组构造函数的装饰器,它将 dtype int64 的对象转换为 dtype int32:

的对象
from functools import wraps

def intas32(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        obj = func(*args, **kwargs)
        if (kwargs.get('dtype') is None 
            and hasattr(obj, 'dtype')
            and obj.dtype == np.int64):
            return obj.astype(np.int32)
        return obj
    return wrapper

现在创建你的版本:

my_arange = intas32(np.arange)

并使用它:

>>> my_arange(2)
array([0, 1], dtype=int32)

或猴子修补 NumPy 以获得所有需要的功能:

>>> np.arange = intas32(np.arange)
>>> np.arange(2)
array([0, 1], dtype=int32)
>>> np.array = intas32(np.array)
>>> np.array(1)
array(1, dtype=int32)

小心并测试这是否真的有效。

您可以通过编程方式执行此操作:

for name in ['array', 'arange']:
    obj = getattr(np, name)
    setattr(np, name, intas32(obj))