如何在 numpy 中执行此操作(平铺操作的链接)?

我正在尝试快速生成 numpy 数组,可能不通过 python。

我想构建一个将其作为输入的一维索引 numpy 数组:

[2,3]和这个[2,4]并且会返回这个

 [0,1,0,1,0,1,2,0,1,2,0,1,2,0,1,2]

说明:

我从 0 迭代到 2(所以 [0,1] 数组)并重复它 2 次: [0,1,0,1]

然后我从 0 迭代到 3(所以 [0,1,2] 数组)并重复它 4 次:[0,1,2,0,1,2,0,1,2,0,1,2] 然后我把所有东西都展平了。

有没有办法在 numpy 中完全做到这一点?现在,我正在使用 np.tile() 分别在 numpy 中构建每个表,然后将所有内容展平,但我觉得有一种更有效的方法可以只转换为 C 函数调用而不转换为 python


DIEA
浏览 229回答 2
2回答

aluckdog

这是一个矢量化的解决方案:def cycles(spec):    steps = np.repeat(*spec)    ps = steps.cumsum()    psj = np.zeros(ps[-1], int)    psj[ps[:-1]] = steps[:-1]    return np.arange(ps[-1]) - psj.cumsum()演示:>>> cycles(((2,3),(2,4)))array([0, 1, 0, 1, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2])

紫衣仙女

我不完全确定这是否是您想要的;这里调用 func() 中的每个元组首先包含范围,然后是重复。import numpydef func(tups):    Arr = numpy.empty(numpy.sum([ele[0] * ele[1] for ele in tups]), dtype=int)    i = 0    for ele in tups:        Arr[i:i + ele[0] * ele[1]] = numpy.tile(numpy.arange(ele[0]), ele[1])        i += ele[0] * ele[1]    return Arrarr = func([(2, 3), (3, 4)])print(arr)# [0 1 0 1 0 1 0 1 2 0 1 2 0 1 2 0 1 2]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python