numpy默认dtype为python整数

时间:2018-01-31 08:57:59

标签: linux windows numpy int64 int32

我有很多nd.array intgers的遗留windows numpy代码,没有明确的dtype。在Windows中,它们被视为np.int32。迁移到linux后,它们变成了np.int64,导致了很多类型的问题。

而不是在代码中的许多地方添加显式dtype,

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

我看到它在两年前的1被问到,并且想知道从那以后可能会发生什么变化。

1 个答案:

答案 0 :(得分:1)

遗留代码的一种解决方法可能是数组构造函数的装饰器,它将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))