我有一个表格的数组A(变量):
A = [1, 3, 7, 9, 15, 20, 24]
现在我想在数组A的值之间创建10个(变量)等间距值,以便得到格式的数组B:
B = [1, 1.2, 1.4, ... 2.8, 3, 3.4, 3.8, ... , 6.6, 7, 7.2, ..., 23.6, 24]
本质上,B应始终具有A值和A值之间的等间距值。
我通过使用代码解决了这个问题:
import numpy as np
A = np.array([1, 3, 7, 9, 15, 20, 24])
B = []
for i in range(len(A) - 1):
B = np.append(B, np.linspace(A[i], A[i + 1], 11))
print (B)
但NumPy是否已经有任何功能,或者是否有其他更好的方法来创建这样的数组。
答案 0 :(得分:8)
使用interpolation代替连接的替代方法:
n = 10
x = np.arange(0, n * len(A), n) # 0, 10, .., 50, 60
xx = np.arange((len(A) - 1) * n + 1) # 0, 1, .., 59, 60
B = np.interp(xx, x, A)
结果:
In [31]: B
Out[31]:
array([ 1. , 1.2, 1.4, 1.6, 1.8, 2. , 2.2, 2.4, 2.6,
2.8, 3. , 3.4, 3.8, 4.2, 4.6, 5. , 5.4, 5.8,
6.2, 6.6, 7. , 7.2, 7.4, 7.6, 7.8, 8. , 8.2,
8.4, 8.6, 8.8, 9. , 9.6, 10.2, 10.8, 11.4, 12. ,
12.6, 13.2, 13.8, 14.4, 15. , 15.5, 16. , 16.5, 17. ,
17.5, 18. , 18.5, 19. , 19.5, 20. , 20.4, 20.8, 21.2,
21.6, 22. , 22.4, 22.8, 23.2, 23.6, 24. ])
这应该比其他解决方案更快,因为它不使用Python for循环,并且不会对linspace
进行多次调用。快速计时比较:
In [58]: timeit np.interp(np.arange((len(A) - 1) * 10 + 1), np.arange(0, 10*len(A), 10), A)
100000 loops, best of 3: 10.3 µs per loop
In [59]: timeit np.append(np.concatenate([np.linspace(i, j, 10, False) for i, j in zip(A, A[1:])]), A[-1])
10000 loops, best of 3: 94.2 µs per loop
In [60]: timeit np.unique(np.hstack(np.linspace(a, b, 10 + 1) for a, b in zip(A[:-1], A[1:])))
10000 loops, best of 3: 140 µs per loop
答案 1 :(得分:3)
您可以在列表理解中使用zip
函数和np.concatenate
但是,如果您想要最后一个元素,也可以使用np.append
附加它:
>>> np.append(np.concatenate([np.linspace(i, j, 10, False) for i,j in zip(A,A[1:])]),A[-1])
array([ 1. , 1.2, 1.4, 1.6, 1.8, 2. , 2.2, 2.4, 2.6,
2.8, 3. , 3.4, 3.8, 4.2, 4.6, 5. , 5.4, 5.8,
6.2, 6.6, 7. , 7.2, 7.4, 7.6, 7.8, 8. , 8.2,
8.4, 8.6, 8.8, 9. , 9.6, 10.2, 10.8, 11.4, 12. ,
12.6, 13.2, 13.8, 14.4, 15. , 15.5, 16. , 16.5, 17. ,
17.5, 18. , 18.5, 19. , 19.5, 20. , 20.4, 20.8, 21.2,
21.6, 22. , 22.4, 22.8, 23.2, 23.6, 24. ])
您也可以使用retstep=True
返回(样本,步骤),其中step是样本之间的间距。
>>> np.concatenate([np.linspace(i, j, 10, False,retstep=True) for i,j in zip(A,A[1:])])
array([array([ 1. , 1.2, 1.4, 1.6, 1.8, 2. , 2.2, 2.4, 2.6, 2.8]),
0.2,
array([ 3. , 3.4, 3.8, 4.2, 4.6, 5. , 5.4, 5.8, 6.2, 6.6]),
0.4,
array([ 7. , 7.2, 7.4, 7.6, 7.8, 8. , 8.2, 8.4, 8.6, 8.8]),
0.2,
array([ 9. , 9.6, 10.2, 10.8, 11.4, 12. , 12.6, 13.2, 13.8, 14.4]),
0.6,
array([ 15. , 15.5, 16. , 16.5, 17. , 17.5, 18. , 18.5, 19. , 19.5]),
0.5,
array([ 20. , 20.4, 20.8, 21.2, 21.6, 22. , 22.4, 22.8, 23.2, 23.6]),
0.4], dtype=object)
答案 2 :(得分:3)
基本上是原始方法的略微浓缩版本:
print np.hstack(np.linspace(a, b, 10, endpoint=False) for a, b in zip(A[:-1], A[1:]))
输出:
[ 1. 1.2 1.4 1.6 1.8 2. 2.2 2.4 2.6 2.8 3. 3.4
3.8 4.2 4.6 5. 5.4 5.8 6.2 6.6 7. 7.2 7.4 7.6
7.8 8. 8.2 8.4 8.6 8.8 9. 9.6 10.2 10.8 11.4 12.
12.6 13.2 13.8 14.4 15. 15.5 16. 16.5 17. 17.5 18. 18.5
19. 19.5 20. 20.4 20.8 21.2 21.6 22. 22.4 22.8 23.2 23.6]
endpoint
参数控制是否在两个原始值之间有9个或10个等间距值。
修改强>
由于你想要最后的24,你可以像Kasra那样append
或者 - 提出一些变化;) - 忘记endpoint
参数并生成{{1从10 + 1
到a
的值。这将自动追加24(默认情况下b
为真)。
(更新:正如Bas Swinckels指出的那样,现在需要用endpoint
包裹它...)
unique