在[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'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]
像这样的错误被一遍又一遍地报告。 由于时间原因,我相当有信心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)]
最有用的评论
获得大于“停止”值的值确实不好,而且有点意外。 如果arange不适合float,则可以检查floaty numpy类型并引发异常。
同样,手动输入dtype确实使用户期望仅输出的类似astype(dtype)的转换。
怎么样:
1.)非整数参数(即开始,停止,步进)的异常。
2.)检查stop> = start是否启动,否则引发异常
3.)在函数开始处将start,stop,step强制转换为int64。
4.)astype(dtype)输出
如果发现非整数输入,则可以代替1.)重定向到arange内的linspace。