以特定方式组合数组元素并记录它

时间:2017-09-17 11:25:02

标签: python arrays numpy iteration

我获得了一维数字。

我需要通过数组添加每个连续元素以形成总和。一旦此总和达到某个值,它就形成了新数组的第一个元素。然后重置总和并重复该过程,从而迭代整个数组。

例如,如果给定: [1,3,4,5,2,5,3] 并要求最低金额为5, 新阵列将是: [8,5,7]

明显:[1 + 3 + 4,5,2 + 5]

然后我还需要记录元素组合方式的特定数组:我需要采用相同长度的不同数组,并以与上面相同的方式组合元素。

e.g。给阵列 [1,2,1,1,3,2,1] 我需要输出 [4,1,5]

明显:[1 + 2 + 1,1,3 + 2]

我用i循环和增量计数器完成了这个,但它非常难看。名为"记录"包含为了使新数组的每个元素相加而得到的旧元素的数量,即[3,1,2]

import numpy as np

def bin(array, min_sum):

    num_points = len(array)

    # Create empty output.
    output = list()
    record = list()

    i = 0

    while i < num_points:

        sum = 0
        j = 0

        while sum < min_sum:

            # Break out if it reaches end of data whilst in loop.
            if i+j == num_points:
                break

            sum += array[i+j]

            j += 1

        output.append(sum)
        record.append(j)

        i += j

    # The final data point does not reach the min sum.
    del output[-1]

    return output

if __name__ == "__main__":
    array = [1, 3, 4, 5, 2, 5, 3]
    print bin(array, 5)

3 个答案:

答案 0 :(得分:1)

我建议你简单地浏览一下清单。将其添加到the_sum之类的累加器(不要使用sum,因为它是内置的),并且如果the_sum达到高于min_sum的数字,则添加它,并将the_sum重置为零。像:

def bin(array, min_sum):
    result = []
    the_sum = 0
    for elem in array:
        the_sum += elem
        if the_sum >= min_sum:
            result.append(the_sum)
            the_sum = 0
    return result

累加器涉及的行以粗体显示。

我将其他数组与练习相同,但作为提示:使用额外的累加器zip同时迭代这两个数组。

答案 1 :(得分:1)

这是一个简单的解决方案。 which计算布尔值列表,其中当累积元素等于或超过目标值时值为true,calc使用此列表计算累积值。

def which(l, s):
    w, a = [], 0
    for e in l:
        a += e
        c = (a >= s)
        w.append(c)
        if c:
            a = 0
    return w

def calc(l, w):
    a = 0
    for (e, c) in zip(l, w):
        a += e
        if c:
            yield a
            a = 0

这是一个互动演示

>>> l1 = [1, 3, 4, 5, 2, 5, 3]
>>> w = which(l1, 5)
>>> w
[False, False, True, True, False, True, False]
>>> list(calc(l1, w))
[8, 5, 7]
>>> l2 = [1, 2, 1, 1, 3, 2, 1]
>>> list(calc(l2, w))
[4, 1, 5]

答案 2 :(得分:0)

你可以使用我在与扁平阵列长期斗争后发现的简短解决方案。

获得有限金额使用:

<button><a herf="#" onClick="myFunction('clk1','c1');">button</a></button>
<p id="clk1"></p> 
..
<button><a herf="#" onClick="myFunction('clk1','c2');">button</a></button>
<p id="clk1"></p> 
..
<button><a herf="#" onClick="myFunction('clk1','c3');">button</a></button>
<p id="clk1"></p> 

输出:

<script>
    var c = {c1: 0, c2: 0, c3: 0}
    function myFunction(paragraph,varibl) {
            c[varibl] = c[varibl] + 1 
            document.getElementById(paragraph).innerHTML = c[varibl];
    }
</script>

要获取您的记录,请使用以下功能:

f = lambda a,x,j,l: 0 if j>=l else [a[i] for i in range(j,l) if sum(a[j:i])<x]

从这里,您可以获得两组记录和总和:

>>> f = lambda a,x,j,l: 0 if j>=l else [a[i] for i in range(j,l) if sum(a[j:i])< x]
>>> a= [1, 3, 4, 5, 2, 5, 3]
>>> f(a,5,0,7) 
[1, 3, 4]
>>> sum(f(a,5,0,7)) 
8
>>> sum(f(a,5,3,7)) 
5
>>> sum(f(a,5,4,7)) 
7
>>>

现在,您甚至可以将它用作第二个向量的索引条件边界:

>>> y = lambda a,x,f,j,l: [] if j>=l else list(np.append(j,np.array(y(a,x,f,j+len(f(a,x,j,l)),l))))