我有一个多维数组用于分数,为此,我需要在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])]