无法在NumPy / SciPy中将dtype从float64更改为int8。如何克服?

时间:2020-07-30 18:04:23

标签: python numpy scipy

我写了以下脚本。我期望np_Xs是一个np.int8 dtype。但是,尽管声明了np.float64,它仍然是np_Xs.astype( np.int8, copy=False )

from scipy.stats import norm

import numpy as np
from numpy.random import default_rng

np_samples = np.random.randint(0, 10, size=2)
print( 'np_samples' )
print( np_samples, np_samples.size, '\n' )

rg = default_rng()
np_p_all = rg.random( size=np_samples.sum() )
print( 'np_p_all' )
print( np_p_all, np_p_all.size, '\n' )

np_Xs = np.floor( norm.ppf( np_p_all, loc=15, scale=5.25 ) )
np_Xs.astype( np.int8, copy=False )
print( 'np_Xs' )
print( np_Xs, np_Xs.size, np_Xs.dtype, '\n' )

输出:

np_samples
[7 3] 2 

np_p_all
[0.40001298 0.86285348 0.78885307 0.678035   0.08950794 0.15995076
 0.19581122 0.29012991 0.30003468 0.89203236] 10 

np_Xs
[13. 20. 19. 17.  7.  9. 10. 12. 12. 21.] 10 float64  #Why is np_Xs not a np.int8?

当我通过空闲终端提交相同的命令时,np_Xs确实更改为np.int8 dtype(请参见下文)。 为什么相同命令(即.astype( np.int8, copy=False )命令)的脚本版本不能提供与空闲终端版本相同/相同的输出?

>>> a = np.array( [0.40001298, 0.86285348, 0.78885307, 0.678035, 0.08950794, 0.15995076, 0.19581122, 0.29012991, 0.30003468, 0.89203236] )
>>> a
array([0.40001298, 0.86285348, 0.78885307, 0.678035  , 0.08950794,
       0.15995076, 0.19581122, 0.29012991, 0.30003468, 0.89203236])
>>> b = np.floor( norm.ppf( a, loc=15, scale=5.25 ) )
>>> b
array([13., 20., 19., 17.,  7.,  9., 10., 12., 12., 21.])
>>> b.astype( np.int8, copy=False )
array([13, 20, 19, 17,  7,  9, 10, 12, 12, 21], dtype=int8)
>>> 

我还尝试在脚本的dtype=np.int8 ufunc中明确声明np.floor()关键字。但是,它也有问题。 我可以知道如何解决TypeError吗?

    np_Xs = np.floor( norm.ppf( np_p_all, loc=15, scale=5.25 ), dtype=np.int8 )
TypeError: No loop matching the specified signature and casting was found for ufunc floor

1 个答案:

答案 0 :(得分:2)

当您执行np_Xs.astype( np.int8, copy=False)时,它将返回数组,因此您必须将其捕获到变量中,例如

np_Xs = np_Xs.astype( np.int8, copy=False)

现在,即使设置了copy=False,它也不会就地更改类型。