Linspace具有自动点数

时间:2018-09-23 13:34:45

标签: python arrays numpy

在像这样使用np.linspace时:

x[a:int(b*2.2+5)] = np.linspace(234.0, 23.4, ...

必须:

  • 要么重复数组切片:

    x[a:int(b*2.2+5)] = np.linspace(234.0, 23.4, len(x[a:int(b*2.2+5)]))
    
  • 或计算其长度:

    x[a:int(b*2.2+5)] = np.linspace(234.0, 23.4, int(b*2.2+5)-a)
    
  • 或使用另一个变量:

    r = range(a,int(b*2.2+5))
    x[r] = np.linspace(234.0, 23.4, len(r))
    
  • 或创建切片:

    x2 = x[a:int(b*2.2+5)]
    x2 = np.linspace(234.0, 23.4, len(x2))
    

          (后者不起作用,因为它不会按要求修改x

有没有一种较短的方法可以自动推断出长度?

x[a:int(b*2.2+5)] = np.autolinspace(234.0, 23.4)

或者是否有内置的Numpy函数:

linspace(234.0, 23.4, destination_array=x[a:int(b*2.2+5)])

2 个答案:

答案 0 :(得分:3)

我认为由于左值与右值的规则,由于右值首先被评估,因此不可能像您所要求的那样自动推断长度。

一种方法是,如果您在numpy数组上编写自定义包装,然后正确覆盖__setitem__。但这对我来说太麻烦了,而不是方便。

答案 1 :(得分:0)

您上次拒绝的解决方案的变体确实有用

In [180]: x=np.zeros(20)
In [181]: x2=x[2:10]
In [182]: x2[:] = np.linspace(0,1,len(x2))
In [183]: x
Out[183]: 
array([0.        , 0.        , 0.        , 0.14285714, 0.28571429,
       0.42857143, 0.57142857, 0.71428571, 0.85714286, 1.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ])

x2view,因此对其进行修改的确会修改x

我能想到的最干净的解决方案是从一个slice对象开始:

In [188]: idx = slice(2,10)
In [189]: x[idx] = np.linspace(1,2,idx.stop-idx.start)
In [190]: x
Out[190]: 
array([0.        , 0.        , 1.        , 1.14285714, 1.28571429,
       1.42857143, 1.57142857, 1.71428571, 1.85714286, 2.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ])