为什么前两行可以是1,而后两行没有1
返回的不应该是一个单位矩阵吗
后两行的两个数值实际上是小于1的,所以转成 int32 时被截断变成了0。
因为在打印numpy.ndarray变量时,默认只保留到小数点后8位,但实际存储的数值的精度可能不止8位。这样打印出来的数值和实际存储的数值不一致。显示时的精度可以通过np.set_printoptions()函数来设置precision参数,默认precision=8。
举个例子,如果是0.999999999(小数点后有9位),打印数组a时会显示 1. ,打印元素a[0]时则会显示 0.999999999 。
>>> a = np.array([0.999999999, 1.000000000, 0.123456789])
>>> a
array([1. , 1. , 0.12345679])
>>> a[0], a[1], a[2]
(0.999999999, 1.0, 0.123456789)
>>> a.astype(np.int32)
array([0, 1, 0])
>>> type(a), type(a[0])
(<type 'numpy.ndarray'>, <type 'numpy.float64'>)
修改precision参数以后:
>>> np.set_printoptions(precision=10)
>>> a = np.array([0.999999999, 1.000000000, 0.123456789])
>>> a
array([0.999999999, 1. , 0.123456789])
建议类型转换前先进行舍入操作:
>>> a = np.array([0.999999999, 1.000000000, 0.123456789])
>>> np.around(a)
array([1., 1., 0.])
>>> np.around(a).astype(np.int32)
array([1, 1, 0])