1

给定数组:

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

2 回答 2

2

一种选择是使用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])
于 2017-04-25T02:12:34.757 回答
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 的建议!

于 2017-04-25T03:28:28.767 回答