在像这样使用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)])
答案 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. ])
x2
是view
,因此对其进行修改的确会修改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. ])