2016-02-07 2 views
2

У меня есть следующий Numpy массив:назначая различные веса каждого столбца Numpy

from sklearn.decomposition import PCA 
from sklearn.preprocessing import normalize 
import numpy as np 

# NumPy array comprising associate metrics 
# i.e. Open TA's, Open SR's, Open SE's 
associateMetrics = np.array([[11, 28, 21], 
    [27, 17, 20], 
    [19, 31, 3], 
    [17, 24, 17]]).astype(np.float64) 
print("raw metrics=", associateMetrics) 

Теперь я хочу, чтобы назначить различные веса каждого столбца в приведенном выше массиве & позже нормализовать это. Напр. скажем, я хочу присвоить более высокий вес 1-й колонке, умножив на 5, несколько столбцов 2 на 3 и последний столбец на 2.

Как это сделать в python? Извините немного новичок в python и numpy.

Я попытался это всего за 1 колонку, но это не будет работать:

# Assign weights to metrics 
weightedMetrics = associateMetrics 
np.multiply(2, weightedMetrics[:,0]) 
print("weighted metrics=", weightedMetrics) 

ответ

3

Вы должны использовать NumPy-х array broadcasting. Это означает, что низкоразмерные массивы могут автоматически расширяться для выполнения векторной операции с массивом более высоких (но совместимых) измерений. В вашем конкретном случае, вы можете умножить свой (4,3) -образный массив с 1d веса массива формы (3,) и получить то, что вы хотите:

weightedMetrics = associateMetrics * np.array([5,3,2]) 

Хитрость заключается в том, что вы можете себе представить Numpy ndarray с, чтобы иметь ведущие одноэлементные размеры, по которому радиовещание осуществляется автоматически. Под этим я подразумеваю, что ваш массив весов 1d numpy формы (3,) может считаться имеющим одномерное измерение (но только с точки зрения трансляции!). И легко увидеть, как массив формы (4,3) и (1,3) следует умножить: каждый элемент последнего должен использоваться для полных столбцов первого.

В самом общем случае вы можете даже использовать арифметические операции, например, из массива формы (3,1,3,1,4) и одного из форм (2,3,4,4). Важно то, что измерения, которые встречаются, должны либо совпадать, либо один из массивов должен иметь одноэлементный размер в этом месте, и одному из массивов разрешено быть длиннее (спереди).

0

Я нашел свой ответ. Это то, что я использовал:

print("weighted metrics=", np.multiply([ 1, 2, 3], associateMetrics)) 
Смежные вопросы