【问题标题】:Python truncating slice assignmentPython截断切片赋值
【发布时间】:2015-12-18 23:13:30
【问题描述】:

我想知道为什么每当我将浮点数分配给 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 6 7 8 9]
lst after assignment:  [ 0  0 10  0  4  5  6  7  8  9]

为什么要这样做?由于您不需要在语言中指定类型,我无法理解为什么 numpy 会在分配给数组(包含整数)之前将 floats 转换为 ints。

【问题讨论】:

  • 此行为不适用于原始列表。
  • 您将 lst 初始化为整数,然后 dtype 没有改变并且小数部分被截断。
  • @erip 你是对的,刚刚检查了我测试原始列表的代码。搞错了

标签: python arrays list numpy


【解决方案1】:

与 python 的本地列表相反,输入了 numpy 数组。尽管这在像 python 这样的动态类型语言中可能是违反直觉的,但它源于 numpy 基本上是一个围绕高度优化的代码的 python 包装器。

您可以通过将 dtype 关键字参数中所需的数据类型传递给 numpy.array 构造函数来更改 numpy 数组的数据类型:

 numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)

dtype : 数据类型,可选

数组所需的数据类型。如果没有给出,那么类型将被确定为在序列中保存对象所需的最小类型。此参数只能用于“向上转换”数组。对于向下转换,请使用 .astype(t) 方法。

numpy constructor

dtype values

【讨论】:

  • 请注意,OP 询问的是numpy.asarray。您的回答仍然很好并且说明了重点,但有点不同。
【解决方案2】:

一旦看到numpy.asarray的签名,答案就很清楚了:

numpy.asarray(a, dtype=None, order=None)

如果dtype 未设置,则由提供的数据推断。在你的情况下,它是ints。

如果你设置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.]

分配后的第一个:[ 0.30000001 0.5 10.60000038 0.2 4. 5. 6. 7. 8. 9. ]

有关更多信息,您可以找到文档here

【讨论】:

  • 哇,很好的答案。谢谢
猜你喜欢
  • 2019-10-22
  • 2016-03-19
  • 2021-01-15
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
  • 2018-01-02
  • 2012-04-26
相关资源
最近更新 更多