Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
迭代动态数量的for循环(Python)_Python_Arrays_For Loop_Numpy - Fatal编程技术网

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

迭代动态数量的for循环(Python),python,arrays,for-loop,numpy,Python,Arrays,For Loop,Numpy,我正在使用python对一些数字进行排序。我想创建一个函数,它允许我输入一个值(4、8、16、32、64等),创建一个数字数组,并重新排列它们的顺序 我添加了一些数字,详细说明了如何确定值=4和8的顺序 对于值=4,数组(x=[0,1,2,3])应分成两部分([0,1]和[2,3]),然后根据每个数组中的第一个数字进行组合([0,2,1,3]) 对于value=8,数组(x=[0,1,2,3,4,5,6,7])应分成两部分([0,1,2,3]和[4,5,6,7])。两个数组应再次分成两部分([

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

我添加了一些数字,详细说明了如何确定值=4和8的顺序

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

对于value=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])组合这些数组

我不知道如何处理递归(为循环动态嵌套)。我试图循环通过拆分阵列创建的每个分支。我已经研究了itertools和recursion(),但我无法让它工作。下面,我添加了代码来说明我目前的方法

非常感谢您的帮助。我也愿意接受其他想法来确定顺序

我正在使用python 2.7.6和numpy

代码:

输出:

[0, 2, 1, 3]
[0, 4, 2, 6, 1, 5, 3, 7]
代码:

输出:

[0, 2, 1, 3]
[0, 4, 2, 6, 1, 5, 3, 7]

value=16的输出应该是[0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]。

这里有一种使用and的NumPythonic方法-

请注意,
.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()
您可以进一步简化并完全替换转置,方法是使用
.ravel('F')
在列的主要顺序中进行
ravel
/
展平
,如在
fortran
中,最终引导我们-

def seq_pow2(N):
    shp = 2*np.ones(np.log2(N),dtype=int)
    return np.arange(N).reshape(shp).ravel('F')
样本运行-

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

最简单的方法是不使用for循环,而是使用numpy执行一些数组操作

N = 8
pow2 = np.log2(N)
out = np.arange(N).reshape([2]*pow2).transpose(np.arange(pow2)[::-1]).flatten()   

   array([0, 4, 2, 6, 1, 5, 3, 7])
它将
x
重塑为
n
维数组,其中
n
是2的幂,对应于
x
的长度。重塑后,每个维的长度为2。然后我们将所有维反转并展平以获得所需的数组

编辑


这是一种类似于的方法,他最终做得更加简洁,但我将把它留给后人。

为了清晰起见,python递归版本:

def rec(n):
    if n==1 : return [0]
    l=[0]*n
    l[::2]=rec(n//2)
    for i in range (0,n,2) : l[i+1]=l[i]+n//2
    return l
为了

或者,观察结果的二进制表示,一个numpy解决方案:

def rearange(N):
    u=2**arange(N.bit_length()-1)
    v=arange(N)
    bits= u[None,:] & v[:,None]
    return sum(bits*u[::-1],1)

你需要numpy的解决方案吗?这可以用简单的python来完成,我想我会说你需要的是采用二进制形式的数字,并按字母顺序对它们进行排序
In [6]: rec(16)
Out[6]: [0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]
def rearange(N):
    u=2**arange(N.bit_length()-1)
    v=arange(N)
    bits= u[None,:] & v[:,None]
    return sum(bits*u[::-1],1)