禁用numpy中的隐式类型转换

4 投票
2 回答
551 浏览
提问于 2025-04-18 18:20

有没有办法在numpy中禁用隐式类型转换?

import numpy as np
a = np.empty(10, int)
a[2] = 4     # OK
a[3] = 4.9   # Will silently convert to 4, but I would prefer a TypeError
a[4] = 4j    # TypeError: can't convert complex to long

能不能让numpy.ndarray对象在赋值时,如果赋的值不是numpy.ndarray类型,就返回一个TypeError错误?如果不能的话,最好的办法是创建一个numpy.ndarray的子类,并重写__setattr____setitem__吗?

2 个回答

0

只是一个想法。

#Python 2.7.3
>>> def test(value):
...     if '.' in str(value):
...         return str(value)
...     else:
...         return value
... 
>>> a[3]=test(4.0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for long() with base 10: '4.0'
3

很遗憾,numpy 在创建数组时并不提供这个功能。你只能在转换数组的时候设置是否允许类型转换(可以查看numpy.ndarray.astype的文档)。

你可以使用这个功能,或者自己创建一个numpy.ndarray的子类,但也可以考虑使用Python自带的array模块来创建一个指定类型的数组:

from array import array

a = array('i', [0] * 10)
a[2] = 4                   # OK
a[3] = 4.9                 # TypeError: integer argument expected, got float

撰写回答