python,矩阵列提取和求和

时间:2018-08-28 19:09:12

标签: python arrays data-analysis

说我有一个矩阵BufferedIOBase。每列A = [a_1,a_2,...,a_n]都属于一个类。所有类别都从1到K。所有n列的标签都存储在一个n维矢量b中。

现在,对于每个第i类,我需要将第i类中的所有向量求和,并将结果向量作为新矩阵的第i列。因此,新矩阵具有K列,与A的行数相同。

我知道nonzero()可以帮助我获取与一个相同标签对应的索引。但是我不知道如何无循环编写所有内容。我实际上正在处理大型矩阵。因此,使用任何“ for”循环肯定会破坏效率。

示例如下:

a_i

2 个答案:

答案 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]等,这样代码就会起作用