说我有一个矩阵BufferedIOBase
。每列A = [a_1,a_2,...,a_n]
都属于一个类。所有类别都从1到K。所有n列的标签都存储在一个n维矢量b中。
现在,对于每个第i类,我需要将第i类中的所有向量求和,并将结果向量作为新矩阵的第i列。因此,新矩阵具有K列,与A的行数相同。
我知道nonzero()可以帮助我获取与一个相同标签对应的索引。但是我不知道如何无循环编写所有内容。我实际上正在处理大型矩阵。因此,使用任何“ for”循环肯定会破坏效率。
示例如下:
a_i
答案 0 :(得分:0)
One way to avoid loops is to use map.
First create a func to reduce a list.
def red(l):
return list(map(lambda x: x[0] + x[1], zip(l[:3], l[3:])))
A = [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]]
Then apply map to the list of lists.
>>> list(map(red, A))
[[5, 7, 9], [17, 19, 21]]

答案 1 :(得分:0)
我不知道为什么您不能使用循环,但这是解决方案
import numpy as np
def masksum(v,vmask,elemn):
vmask = list(map(lambda x: 1 if x == elemn else 0, vmask))
a = np.array(v)
return np.sum(a * vmask)
def mysum(v1,vmask):
norepeat = list(set(vmask))
return list(map(lambda elemn: masksum(v1,vmask,elemn),norepeat))
A = [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]]
label = [1,2,3,1,2,3]
result = list(map(lambda vectori: mysum(vectori,label), A))
print(result)
标签就像一个面具,您可以尝试使用[1,3,3,1,3,3]或[4,4,4,5,5,5]等,这样代码就会起作用