Numpy计算来自不规则维度的列和



我有一个多维数组用于分数,为此,我需要在Python中获得第三级每列的总和。我正在使用Numpy

import numpy as np

数据是这样的:

score_list = [
[[1,1,3], [1,2,5]],
[[2,7,5], [4,1,3]]
]

这应该返回:

[[3 8 8] [5 3 8]]

sum_array = np_array.sum(axis=0)
print(sum_array)

但是,如果我有这样的不规则形状:

score_list = [
[[1,1], [1,2,5]],
[[2,7], [4,1,3]]
]

我希望它返回:

[[38] [5 38]]

然而,它会出现警告,返回值是:

[列表([1,1、2、7])列表([1、2、5、4、1、3]))

我怎样才能得到预期的结果?

numpy将尝试将其强制转换为and数组,这将失败,而是考虑使用zip单独传递每个子列表。

score_list = [
[[1,1], [1,2,5]],
[[2,7], [4,1,3]]
]
import numpy as np
res = [np.sum(x,axis=0) for x in zip(*score_list)]
print(res)
[array([3, 8]), array([5, 3, 8])]

这里有一个解决方案,请记住,它不使用numpy,对于较大的矩阵将非常低效(但对于较小的矩阵运行良好)。

# Create matrix
score_list = [
[[1,1,3], [1,2,5]],
[[2,7,5], [4,1,3]]
]
# Get each row
for i in range(1, len(score_list)):
# Get each list within the row
for j in range(len(score_list[i])):
# Get each value in each list
for k in range(len(score_list[i][j])):
# Add current value to the same index 
# on the first row 
score_list[0][j][k] += score_list[i][j][k]
print(score_list[0])

肯定会有更好的解决方案,但这只是暂时的解决方案。

编辑。更有效率

一个可能的解决方案:

a = np.vstack([np.array(score_list[x], dtype='object')
for x in range(len(score_list))])
[np.add(*[x for x in a[:, i]]) for i in range(a.shape[1])]

另一个可能的解决方案:

a = sum(score_list, [])
b = [a[x] for x in range(0,len(a),2)]
c = [a[x] for x in range(1,len(a),2)]
[np.add(x[0], x[1]) for x in [b, c]]
输出:

[array([3, 8]), array([5, 3, 8])]

最新更新