迭代动态数量的for循环(Python)

nkz*_*nkz 7 python arrays for-loop numpy

我正在使用python来排序一些数字.我想创建一个函数,允许我输入一个值(4,8,16,32,64等),创建一个数字数组,并重新排列它们的序列.

我添加了详细说明如何确定value = 4和8的序列的数字.

对于value = 4,数组(x = [0,1,2,3])应分成两部分([0,1]和[2,3]),然后根据每个数组中的第一个数字进行组合([ 0,2,1,3]).

图中序列的值= 4

对于值= 8,数组(x = [0,1,2,3,4,5,6,7])应分为两个([0,1,2,3]和[4,5,6, 7]).两个阵列应再次分成两部分([0,1,2,3]分为[0,1]和[2,3]和[4,5,6,7]分为[4,5]和[6, 7]).然后应该根据每个数组中的第一个数字和第二组数组的序列([0,4,2,6,1,5,3,7])组合数组.

值的序列图= 8

我不知道如何处理递归(动态嵌套for循环).我试图循环通过拆分数组创建的每个brach.我查看了itertools和递归(具有不同数量的For Loops(python)的函数),但我无法使其工作.下面,我添加了代码来说明到目前为止的方法.

任何帮助深表感谢.我也愿意接受其他想法来确定序列.

我正在使用python 2.7.6和numpy.

码:

import numpy
value = 4
a = []
x = numpy.arange(value)
y = numpy.array_split(x, 2)
for i in range(2):
    for j in y:
        a.append(j.tolist()[i])
print(a)
Run Code Online (Sandbox Code Playgroud)

输出:

[0, 2, 1, 3]
Run Code Online (Sandbox Code Playgroud)

码:

import numpy
value = 8
a = []
x = numpy.arange(value)
y = numpy.array_split(x, 2)
for i in range(2):
    for h in range(2):
        for j in y:
        z = numpy.array_split(j, 2)
                a.append(z[h][i])
    print(a)
Run Code Online (Sandbox Code Playgroud)

输出:

[0, 4, 2, 6, 1, 5, 3, 7]
Run Code Online (Sandbox Code Playgroud)

值= 16的输出应该是[0,8,4,12,2,10,6,14,1,9,5,13,​​3,11,715].

Div*_*kar 2

np.transpose这是使用and的 NumPythonic 方式reshaping -

def seq_pow2(N):
    shp = 2*np.ones(np.log2(N),dtype=int)
    return np.arange(N).reshape(shp).transpose(np.arange(len(shp))[::-1]).ravel()
Run Code Online (Sandbox Code Playgroud)

请注意,这.transpose(np.arange(len(shp))[::-1]将简化为.T,因此我们将有一个简化版本 -

def seq_pow2(N):
    shp = 2*np.ones(np.log2(N),dtype=int)
    return np.arange(N).reshape(shp).T.ravel()
Run Code Online (Sandbox Code Playgroud)

您可以通过像with 那样以列优先顺序执行ravel/来进一步简化和完全替换转置,最终引导我们 -flatteningfortran.ravel('F')

def seq_pow2(N):
    shp = 2*np.ones(np.log2(N),dtype=int)
    return np.arange(N).reshape(shp).ravel('F')
Run Code Online (Sandbox Code Playgroud)

样本运行 -

In [43]: seq_pow2(4)
Out[43]: array([0, 2, 1, 3])

In [44]: seq_pow2(8)
Out[44]: array([0, 4, 2, 6, 1, 5, 3, 7])

In [45]: seq_pow2(16)
Out[45]: array([ 0,  8,  4, 12,  2, 10,  6, 14,  1,  9,  5, 13,  3, 11,  7, 15])
Run Code Online (Sandbox Code Playgroud)