Python截断片分配
我想知道为什么每当我将浮点数赋给numpy数组时,Python都会将数字截断为整数:Python截断片分配,python,arrays,list,numpy,Python,Arrays,List,Numpy,我想知道为什么每当我将浮点数赋给numpy数组时,Python都会将数字截断为整数: import numpy as np lst = np.asarray(list(range(10))) print ("lst before assignment: ", lst) lst[:4] = [0.3, 0.5, 10.6, 0.2]; print ("lst after assignment: ", lst) 输出: lst before assignment: [0 1 2 3 4 5
import numpy as np
lst = np.asarray(list(range(10)))
print ("lst before assignment: ", lst)
lst[:4] = [0.3, 0.5, 10.6, 0.2];
print ("lst after assignment: ", lst)
输出:
lst before assignment: [0 1 2 3 4 5 6 7 8 9]
lst after assignment: [ 0 0 10 0 4 5 6 7 8 9]
为什么会这样?由于不需要在语言中指定类型,我无法理解为什么numpy会在分配给数组(包含整数)之前将
float
s转换为int
s。在python的本机列表中,numpy数组是类型化的。尽管这在动态类型语言(如python)中可能是违反直觉的,但它源于这样一个事实,即numpy基本上是一个围绕高度优化代码的python包装器
通过将dtype
关键字参数中所需的数据类型传递给numpy.array构造函数,可以更改numpy数组的数据类型:
numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
数据类型:数据类型,可选
阵列所需的数据类型。如果未给出,则类型将被确定为在序列中保存对象所需的最小类型。此参数只能用于“向上投射”数组。对于向下广播,请使用.astype(t)方法
在python本机列表的位置,键入了numpy数组。尽管这在动态类型语言(如python)中可能是违反直觉的,但它源于这样一个事实,即numpy基本上是一个围绕高度优化代码的python包装器 通过将
dtype
关键字参数中所需的数据类型传递给numpy.array构造函数,可以更改numpy数组的数据类型:
numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
数据类型:数据类型,可选
阵列所需的数据类型。如果未给出,则类型将被确定为在序列中保存对象所需的最小类型。此参数只能用于“向上投射”数组。对于向下广播,请使用.astype(t)方法
一旦
numpy,答案就很清楚了。asarray
的签名如下:
numpy.asarray(a, dtype=None, order=None)
如果未设置dtype
,则根据提供的数据推断。在你的例子中,它是int
s
如果设置dtype=np.float32
,则可以使示例正常工作:
import numpy as np
lst = np.asarray(list(range(10)), dtype=np.float32)
print "lst before assignment: ", lst
lst[:4] = [0.3, 0.5, 10.6, 0.2];
print "lst after assignment: ", lst
转让前第一次转让:[0.1.2.3.4.5.6.7.8.9]
分配后的lst:[0.3000001 0.5 10.60000038 0.2 4.5.6。
7.8.9.]
有关更多信息,您可以找到文档。一旦
numpy,答案就很清楚了。asarray的签名如下:
numpy.asarray(a, dtype=None, order=None)
如果未设置dtype
,则根据提供的数据推断。在你的例子中,它是int
s
如果设置dtype=np.float32
,则可以使示例正常工作:
import numpy as np
lst = np.asarray(list(range(10)), dtype=np.float32)
print "lst before assignment: ", lst
lst[:4] = [0.3, 0.5, 10.6, 0.2];
print "lst after assignment: ", lst
转让前第一次转让:[0.1.2.3.4.5.6.7.8.9]
分配后的lst:[0.3000001 0.5 10.60000038 0.2 4.5.6。
7.8.9.]
有关详细信息,您可以找到文档。此行为不适用于基本体列表。您将lst初始化为ints,然后dtype
没有更改,小数部分被截断。@erip您是对的,只是检查了我测试基本体列表时使用的代码。出错此行为不适用于基元列表。您将lst初始化为ints,然后dtype
没有更改,小数部分被截断。@erip您是对的,只是检查了我测试基元列表时使用的代码。犯了个错误哇,回答得很好。谢谢哇,回答得很好。谢谢注意OP询问的是numpy.asarray
。你的回答仍然很好,很有道理,但有点不同。请注意,OP询问的是numpy.asarray
。你的答案仍然很好,很有道理,但有点不同。