【问题标题】:python numpy arange dtpye? why converting to integer was zeropython numpy arange dtpye?为什么转换为整数为零
【发布时间】:2018-10-14 17:13:47
【问题描述】:

x = np.arange(0.3, 12.5, 0.6)

打印(x)

[0.3 0.9 1.5 2.1 2.7 3.3 3.9 4.5 5.1 5.7 6.3 6.9 7.5 8.1 8.7 9.3 9.9 10.5 11.1 11.7 12.3]

x = np.arange(0.3, 12.5, 0.6,int)

打印(x)

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

【问题讨论】:

  • 由于浮点数舍入,即使np.arange(0.3, 12.5, 0.6).astype(int) 也会产生意外。
  • 首先谢谢,我想知道具体是什么原因.dtype?

标签: python numpy


【解决方案1】:

当指定dtype = int 时,它将开始、停止和步进转换为相同的。

所以,它变成了int(start), int(stop), int(step)

因此,在您的情况下,当指定 dtype = int 时,开始和步骤保持为 0,您会得到一个全为 0 的数组。

这里已经讨论过这个问题并有解释:

https://github.com/numpy/numpy/issues/2457

【讨论】:

  • 首先谢谢你,我想知道究竟是什么原因。数据类型?
  • 我想,是的。
【解决方案2】:

首先让我们跳过浮动步骤的复杂性,并使用简单的整数开始和停止:

In [141]: np.arange(0,5)
Out[141]: array([0, 1, 2, 3, 4])
In [142]: np.arange(0,5, dtype=int)
Out[142]: array([0, 1, 2, 3, 4])
In [143]: np.arange(0,5, dtype=float)
Out[143]: array([0., 1., 2., 3., 4.])
In [144]: np.arange(0,5, dtype=complex)
Out[144]: array([0.+0.j, 1.+0.j, 2.+0.j, 3.+0.j, 4.+0.j])
In [145]: np.arange(0,5, dtype='datetime64[D]')
Out[145]: 
array(['1970-01-01', '1970-01-02', '1970-01-03', '1970-01-04',
       '1970-01-05'], dtype='datetime64[D]')

即使bool工作,在一定范围内:

In [149]: np.arange(0,1, dtype=bool)
Out[149]: array([False])
In [150]: np.arange(0,2, dtype=bool)
Out[150]: array([False,  True])
In [151]: np.arange(0,3, dtype=bool)
ValueError: no fill-function for data-type.
In [156]: np.arange(0,3).astype(bool)
Out[156]: array([False,  True,  True])

有 2 个可能的布尔值,所以要求更多应该会产生某种错误。

arange是编译后的代码,所以我们不能轻易检查它的逻辑(但欢迎您在github上搜索C代码)。

示例表明它确实在某种意义上将参数转换为相应的dtype,并对其执行迭代。它不会简单地生成范围并在最后转换为 dtype。

【讨论】:

  • 谢谢,那我就按照上面说的做float类型.astype(int)吧。