给定数组:
arr=np.array([0,10,20,30])`
我想最终得到一个通过x
索引扩展每个条目的数组,例如何时x=2
获取:
array([0,1,2,10,11,12,20,21,22,30,31,32])`
有没有比这更好的方法:
np.concatenate((arr, arr+1, arr+2))
array([ 0, 10, 20, 30, 1, 11, 21, 31, 2, 12, 22, 32])
给定数组:
arr=np.array([0,10,20,30])`
我想最终得到一个通过x
索引扩展每个条目的数组,例如何时x=2
获取:
array([0,1,2,10,11,12,20,21,22,30,31,32])`
有没有比这更好的方法:
np.concatenate((arr, arr+1, arr+2))
array([ 0, 10, 20, 30, 1, 11, 21, 31, 2, 12, 22, 32])
一种选择是使用numpy.broadcasting
; 将arr重塑为二维数组并将其添加到递增的步长数组中;广播规则将对两个数组进行笛卡尔加法;展平 2d 结果将为您提供输出:
x = 2
(arr[:, None] + np.arange(x+1)).ravel()
# array([ 0, 1, 2, 10, 11, 12, 20, 21, 22, 30, 31, 32])
另一种方法:
x = 2
np.repeat(arr, x+1) + np.tile(np.arange(x+1), arr.size)
# array([ 0, 1, 2, 10, 11, 12, 20, 21, 22, 30, 31, 32])
Python 和 NumPy 混搭解决方案:
In [69]: np.array([list(range(num, num+x+1)) for num in arr]).ravel()
Out[69]: array([ 0, 1, 2, 10, 11, 12, 20, 21, 22, 30, 31, 32])
比上述解决方案快一点的解决方案是for
在列表推导中使用两个循环来避免显式数组展平。
In [88]: np.array([num+i for num in arr for i in range(x+1)])
Out[88]: array([ 0, 1, 2, 10, 11, 12, 20, 21, 22, 30, 31, 32])
感谢@psidom 的建议!