2

鉴于此值列表:

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 种方式排序:增加、减少、“钟形”、“曲线”、“波浪”

前2个可以通过

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]

而“曲线”应该是这样的:

[9.0,8.0,7.0,6.5,5.5,6.0,7.5,8.0,9.0,10.0]

并且“Wave”应该是这样的(它是 cos-like 还是 sine-like wave 并不重要):

[5.5,7.0, 8.0, 10.0, 9.0,7.5, 6.0, 6.5, 8.0, 9.0]
4

3 回答 3

3

对于 Wave,您可以遵循 Alex L 的想法:将排序后的数组划分为子数组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,然后将它们放在一起。

于 2012-12-28T09:03:49.053 回答
2

贝尔/曲线的一个想法:

>>> 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)]    
于 2012-12-28T07:43:34.453 回答
2

“Bell”可以是两个子数组,一个是递增的,一个是递减的。继续这个想法来解决其他问题。

于 2012-12-28T07:43:05.077 回答