Numpy: dtype = int的arange的意外输出

创建于 2020-05-05  ·  5评论  ·  资料来源: numpy/numpy


在[3]中:np.arange(-3,0,0.5,dtype = int)
Out [3]:array([-3,-2,-1,0,1,2])

好吧,看到“ 1”和“ 2”对我们来说有点出乎意料,因为两个数字都大于0。

通常,这是不使用dtype = int的结果:

In [2]: np.arange(-3, 0, 0.5)                                                  
Out[2]: array([-3. , -2.5, -2. , -1.5, -1. , -0.5])
and we should get this with dtype=int:
In [4]: np.arange(-3, 0, 0.5).astype(int)                                      
Out[4]: array([-3, -2, -2, -1, -1,  0])

numpy手册指出:
dtype:dtype
输出数组的类型。 如果未给出dtype,则从其他输入参数推断数据类型。

因此,它应该只影响输出数组,对不对?

import numpy as np
print(np.arange(-3, 0, 0.5))
print(np.arange(-3, 0, 0.5, dtype=int))
print(np.arange(-3, 0, 0.5).astype(int))

错误信息:

没有错误讯息...

Numpy / Python版本信息:

我们在numpy'1.18.4'(纯Python 3.7.6)和'1.18.1'(Anaconda 3.7并应用了最新更新)下对其进行了测试。 结果相同。

1.18.4 3.7.6(默认,2020年2月28日,15:25:38)
[Clang 11.0.0( https://github.com/llvm/llvm-project.git eefbff0082c5228e01611f7

1.18.1 3.7.4(默认,2019年8月13日,20:35:49)
[GCC 7.3.0]

00 - Bug numpy.core

最有用的评论

获得大于“停止”值的值确实不好,而且有点意外。 如果arange不适合float,则可以检查floaty numpy类型并引发异常。

同样,手动输入dtype确实使用户期望仅输出的类似astype(dtype)的转换。

怎么样:
1.)非整数参数(即开始,停止,步进)的异常。
2.)检查stop> = start是否启动,否则引发异常
3.)在函数开始处将start,stop,step强制转换为int64。
4.)astype(dtype)输出

如果发现非整数输入,则可以代替1.)重定向到arange内的linspace。

所有5条评论

像这样的错误被一遍又一遍地报告。 由于时间原因,我相当有信心arange的实现如下:

def arange(start, stop, step, dtype):
    n = (start - stop) // step

    # dtype.type is a cast
    step = dtype.type(start + step) - dtype.type(start)

    # now do what you expect
    return [start + step*i for i in range(n)]

也许我们应该将该伪代码添加到文档中?

是的,该代码是正确的(尽管不能100%确定n计算结果)。 这个特定的例子是极端的,显然是坏的,也许我们实际上可以以某种方式摆脱它?

arange一再被讨厌的可能是错误的定义所困扰,但我想不出一个解决它的好提议(尽管也许有人提出过)。
它不像我们可以很好地更改浮点数的arange行为(也许是精确的修正,但是端点更改不是很好的IMO)。 因此我们需要创建一个新函数...但是在大多数情况下,在我看来, linspace比“正确的”浮点数更好,我不确定校正后的浮点数实际上是否具有太多的用例。

最后,我想我想要一个深思熟虑的建议:/ ...

获得大于“停止”值的值确实不好,而且有点意外。 如果arange不适合float,则可以检查floaty numpy类型并引发异常。

同样,手动输入dtype确实使用户期望仅输出的类似astype(dtype)的转换。

怎么样:
1.)非整数参数(即开始,停止,步进)的异常。
2.)检查stop> = start是否启动,否则引发异常
3.)在函数开始处将start,stop,step强制转换为int64。
4.)astype(dtype)输出

如果发现非整数输入,则可以代替1.)重定向到arange内的linspace。

嘿,我是开源贡献的完整入门者。 想试试看。 这段代码怎么样? @ eric-wieser

x = []
for i in range(start, stop):
    x.append(i)
    x.append(i+step)
print(np.array(x, dtype))

像这样的错误被一遍又一遍地报告。 由于时间原因,我相当有信心arange的实现如下:

def arange(start, stop, step, dtype):
    n = (start - stop) // step

    # dtype.type is a cast
    step = dtype.type(start + step) - dtype.type(start)

    # now do what you expect
    return [start + step*i for i in range(n)]
此页面是否有帮助?
0 / 5 - 0 等级