为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

DIEA 2021-08-24 18:27:37
我正在尝试快速生成 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 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

这是一个矢量化的解决方案:


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


查看完整回答
反对 回复 2021-08-24
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

我不完全确定这是否是您想要的;这里调用 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]


查看完整回答
反对 回复 2021-08-24
  • 2 回答
  • 0 关注
  • 224 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信