我写了以下脚本。我期望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
答案 0 :(得分:2)
当您执行np_Xs.astype( np.int8, copy=False)
时,它将返回数组,因此您必须将其捕获到变量中,例如
np_Xs = np_Xs.astype( np.int8, copy=False)
现在,即使设置了copy=False
,它也不会就地更改类型。