我正在使用python对一些数字进行排序。我想创建一个函数,让我输入一个值(4、8、16、32、64等),创建一个数字数组,并重新排列其顺序。
我添加了一些图,这些图详细说明了如何确定value = 4和8的顺序。
对于值= 4,应将数组(x = [0,1,2,3])分成两部分([0,1]和[2,3]),然后根据每个数组中的第一个数字([[ 0,2,1,3])。
对于值= 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和递归(具有数量不同的For循环(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)
输出:
[0, 2, 1, 3]
代码:
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)
输出:
[0, 4, 2, 6, 1, 5, 3, 7]
值= 16的输出应为[0、8、4、12、2、10、6、14、1、9、5、13、3、11、7 15]。
下面是一个使用NumPythonic方式np.transpose
和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()
请注意,.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
/flattening
在列主要订货像fortran
与.ravel('F')
最终导致我们-
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])
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句