我正在尝试快速生成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
答案 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]