питон, извлечение столбца матрицы и сумма - PullRequest
0 голосов
/ 28 августа 2018

Скажите, у меня есть матрица A = [a_1,a_2,...,a_n]. Каждый столбец a_i принадлежит классу. Все классы имеют значение от 1 до K. Все метки n столбцов хранятся в одном n-dim векторе b.

Теперь для каждого класса i мне нужно сложить все векторы в классе i и поместить вектор результата как i-й столбец новой матрицы. Таким образом, новая матрица имеет K столбцов, столько же строк, сколько и A.

Я знаю, что nonzero () может помочь мне получить индекс, соответствующий одному и тому же ярлыку. Но я не знаю, как написать все без цикла . Я на самом деле работаю над большой матрицей. Так что использование любого цикла for определенно разрушит эффективность.

Пример следующий:

A = [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]]

label = [1,2,3,1,2,3]

New matrix = [[1+4,2+5,3+6],
             [7+10,8+11,9+12]]

K=3, n=6

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Я не знаю, почему вы не можете использовать циклы, но вот решение

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] и т. Д., И код будет работать

0 голосов
/ 28 августа 2018
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]]

    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...