我正在尝试找到连续的非零张量值的总和,如下所示
比方说,我有一个张量A = [1.3, 0.0, 0.6, 0.7, 0.8]
。我想
1)对张量的连续个非零值求和以输出[1.3, 0.0, 2.1]
,然后选择最大值2.1
。
2)还要找到用于对这些值求和的索引。在这种情况下,它将是2, 3, 4
。
答案 0 :(得分:0)
我们可以通过两个简单的步骤解决此问题:
首先,基于零分割主张量。因此,给定的张量A
看起来像[ [1.3], [0], [0.6, 0.7, 0.8] ]
。可以使用以下功能完成此操作:
def split_list(lst, value=0):
"""
Splits a given list based on a given value
default is zero
"""
groups = []
sub_group = []
for i in lst:
if i == 0:
groups.append(sub_group)
sub_group = []
groups.append([0])
else:
sub_group.append(i)
if sub_group:
groups.append(sub_group)
return groups
第二,对每个子组求和。返回的索引会有些棘手。因此,让我们在代码中看到它:
def get_max_indices(groups):
"""
This function takes a list of lists and
returns the indices of the maximum elements
"""
maximum = 0
max_length = 0
total_elements = 0
length_before = 0
for idx, sub_group in enumerate(groups):
summation = sum(sub_group)
if summation > maximum:
maximum = summation
max_length = len(sub_group)
length_before = total_elements
total_elements += len(sub_group)
return [_ for _ in range(length_before, length_before+max_length)]
现在,让我们同时尝试它们:
>>> lst = [1.3, 0, 0.6, 0.7, 0.8]
>>> groups = split_list(lst, value=0)
>>> print(get_max_indices(groups))
[2, 3, 4]
让我们尝试另一个示例:
>>> lst = [1, 2, 3, 0, 6, 9, 0, 10]
>>> groups = split_list(lst, value=0)
>>> print(get_max_indices(groups))
[4, 5]
我希望这可以解决您的问题。我知道这比您想象的要复杂一些,但这将使您入门。我认为可以对此进行优化和清理,但我将留给您。
答案 1 :(得分:0)
我的方法与@Anwarvic有所不同。我试图一口气做到这一点。请参见下面的功能。它遍历数组,并保持到目前为止已看到的最大值和当前和的对数。如果我们为零,则当前总和更新为0;如果非零,则将当前总和更新为当前值。
def find_continguous_max_sum(t):
max_,cur=0,0
max_indices, cur_indices = [], []
for idx, i in enumerate(t):
if (i==0.0):
cur = 0
cur_indices = []
else:
cur = cur+i
cur_indices.append(idx)
if (max_ < cur):
max_ = cur
max_indices = cur_indices
return max_, max_indices
#usage
find_contiguous_max_sum(A)