2017-04-25 77 views
1

鉴于阵列的以下数字:如何延长一个numpy的阵列为包括x的每个条目

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]) 

回答

2

一种选择是使numpy.broadcasting使用;将arr重塑为2d阵列并将其添加到递增步数组;广播规则将对这两个数组进行笛卡尔增加;扁平化的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]) 
+0

您可以尝试在第一个解决方案中使用'x'来使事物具有通用性。只是'np.arange(x + 1)' – kmario23

+1

@ kmario23好主意。 – Psidom

1

一个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的建议!

相关问题