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

时间:2018-11-21 23:44:45

标签: python arrays 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

2 个答案:

答案 0 :(得分:3)

这是向量化的解决方案:

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

答案 1 :(得分:0)

我不确定这是否是您想要的;这里对func()的调用中的每个元组首先包含范围,然后是重复。

import numpy


def 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 Arr


arr = 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]