对二维列表中的值执行操作并将每个子列表附加到新列表

performing operations on values in 2-D list and appending each sub-list to new list

我有两个二维 python 数组列表。我想在每个数组中的每个值上相互执行操作并将该值附加到列表中,同时保留二维结构。

比如我有

list1 = [[1,2,3],[4,5,6],[7,8,9]]
list2 = [[3,2,1],[6,5,4],[9,8,7]]

我想这样做(例如只是简单的加法)输出是

output_list: [[4,4,4],[10,10,10],[16,16,16]]

在我的例子中,我正在计算标准偏差。

我有两个名为 rolling_meanmean_std 的二维列表,我正在对其进行并行迭代并附加到名为 lower_bound

的列表
lower_bound = []
    

    for k,h in zip(range(len(rolling_mean)),range(len(mean_std))):
        for l,m in zip(range(len(rolling_mean[k])),range(len(mean_std[h]))):
            lower_bound.append(rolling_mean[k][l] - (1.96 * mean_std[h][m]))

    print(lower_bound)

这给了我正确的输出,但所有值都在一个数组中。我希望它是一个二维数组,就像上面的示例输出一样。

...
lb_part = []
for l,m ...
    lb_part.append(...)
lower_bound.append(lb_part)

通用函数 recziprecmap 可能对您有用 -

def reczip(a,b,f=tuple):
  if isinstance(a, list) and isinstance(b, list):
    return list(reczip(v, b[i], f) for (i,v) in enumerate(a))
  else:
    return f((a,b))
x = [[1,2,3],[[4],[5,6]],9]
y = [[3,2,1],[[6],[5,4]],9]
print(reczip(x,y))
[[(1, 3), (2, 2), (3, 1)], [[(4, 6)], [(5, 5), (6, 4)]], (9, 9)]
def recmap(a,f):
  if isinstance(a, list):
    return list(recmap(v, f) for v in a)
  else:
    return f(a)
print(recmap(reczip(x,y),sum))
[[4, 4, 4], [[10], [10, 10]], 18]

如您所见,这些适用于任何嵌套级别的列表。但是,如果reczip遇到不对称的形状,可以相应处理-

def reczip(a,b,f=tuple):
  try:
    if isinstance(a, list) and isinstance(b, list):
      return list(reczip(v, b[i], f) for (i,v) in enumerate(a))
    else:
      return f((a,b))
  except IndexError:
    return f((a,b)) # when a and b have different number of elements