给出这个值列表:
print samples
[5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0]
我需要为新的数组长度n
生成n
个值。这可以这样实现。
for i in range(n):
My_array.append(random.choice(samples))
现在My_array
需要排序,有5种方式:增加,减少,'贝尔','曲线','波'
前两个可以通过
实现print sorted(My_array,reverse=False)
[5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.0, 9.0, 9.0, 10.0]
print sorted(My_array,reverse=True)
[10.0, 9.0, 9.0, 8.0, 8.0, 7.5, 7.0, 6.5, 6.0, 5.5]
剩下的三个怎么样?
在上面的例子中,'Bell'应该是这样的:
[5.5,6.5,7.0,8.0,9.0,10.0,9.0,8.0,7.5,6.0]
虽然'Curve'应该是这样的:
[9.0,8.0,7.0,6.5,5.5,6.0,7.5,8.0,9.0,10.0]
和'Wave'应该是这样的(如果它是类似cos或类似正弦的波,那真的无关紧要):
[5.5,7.0, 8.0, 10.0, 9.0,7.5, 6.0, 6.5, 8.0, 9.0]
答案 0 :(得分:3)
对于Wave,您可以遵循Alex的想法:将已排序的数组划分为d
个子数组,按升序排序其中一些,然后按降序排序,然后将它们放在一起:
def wave_sort(array, num_peaks=None, start_ascending=True):
"""Sorts the elements of `array` in a sine or cosine manner.
:param array: The array to be sorted.
:param num_peaks: The number of (low and high) peaks in the resultant array
:param start_ascending: If True the result is sin-like, otherwise cos-like.
"""
if num_peaks is None:
num_peaks = len(array) // 6
sorted_ar = sorted(array)
subarrays = [sorted_ar[i::num_peaks] for i in range(num_peaks)]
for i, subarray in enumerate(subarrays, start=int(not start_ascending)):
if i % 2:
# subarrays are in ascending order already!
subarray.reverse()
return sum(subarrays, [])
另一种实现相同目的的方法是将已排序的数组拆分为d/2
子数组,并使用Alex L解决方案为每个子数组获取Bell,然后将它们放在一起。
答案 1 :(得分:2)
“贝尔”可以是两个子阵列,一个排序增加其他子阵列。对其他问题继续这个想法。
答案 2 :(得分:2)
Bell / Curve的想法:
>>> ss = sorted(samples)
[5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0]
>>> ss[::2]
[5.0, 6.0, 7.0, 8.0, 9.0, 10.0]
>>> ss[-2::-2]
[9.5, 8.5, 7.5, 6.5, 5.5]
>>> ss[-2::-2] + ss[::2]
[9.5, 8.5, 7.5, 6.5, 5.5, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]
另外,如果您要重新排序样本数组,而不是您的方法(将重复项目)
for i in range(n):
My_array.append(random.choice(samples))
您可以使用:
>>> samples
[5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0]
>>> shuffled = samples
>>> random.shuffle(shuffled)
>>> shuffled
[10.0, 6.0, 5.0, 6.5, 7.5, 7.0, 8.0, 8.5, 5.5, 9.0, 9.5]
或列表理解:
My_array = [random.choice(samples) for _ in range(n)]