给定一个任意的numpy
数组(其大小和形状似乎不起作用)
import numpy as np
a = np.array([1.])
print(a.dtype) # float64
如果将其乘以等于或大于10**20
的数字,则会更改其dtype
print((a*10**19).dtype) # float64
print((a*10**20).dtype) # object
a *= 10**20 # Throws TypeError: ufunc 'multiply' output (typecode 'O')
# could not be coerced to provided output parameter (typecode 'd')
# according to the casting rule ''same_kind''
a *= 10.**20 # Throws numpy.core._exceptions._UFuncOutputCastingError:
# Cannot cast ufunc 'multiply' output from dtype('float64') to
# dtype('int32') with casting rule 'same_kind'
但是,如果您将元素相乘,则不会发生这种情况
a[0] *= 10**20
print(a, a.dtype) # [1.e+20] float64
或将数字转换为float
(或int
)
a *= float(10**20)
print(a, a.dtype) # [1.e+20] float64
仅供参考,如果在numpy
之外执行乘法,则不会出现问题
b = 1.
print(type(b), type(10**20), type(10.**20)) # float int float
b *= 10**20
print(type(b)) # float
1条答案
按热度按时间cigdeys31#
我希望它是一个“自然”整数在系统上所能呈现的大小。
这就是 * 在我的系统上 * 开始向
object
转换的地方,当我这样做时我确实期望它与整数的实现相联系:
PEP 0237:本质上,long重命名为int。也就是说,只有一个内置的整型,名为int;但它的行为与旧的long类型基本相同。
请访问https://docs.python.org/3.1/whatsnew/3.0.html#integers
要注意这一点,可以使用
numpy.multiply
和强制输出类型,这将抛出一个错误,并且不会进行静默转换(类似于*=
示例)。