Я работаю с: x = pd.DataFrame(np.random.randint(0,10,size=(20, N)))
с N>5000
и y = np.random.dirichlet(np.ones(20),size=1)
.
Я выполнял матричный продукт между каждыми x
столбцами и y
(который представляет собой список весов с суммой 1), чтобы получить массив из N
элементов, поэтому я использую x.T.dot(y)
.
Теперь я хотел бы изменить вычисление моего матричного произведения: для каждого 0 в текущем столбце X, который вычисляется, мы переоцениваем y
, не считая вес, который был бы умножен на 0 и равномерно распределен это между весами, которые будут умножены на значения, отличные от 0, поэтому сумма списка по-прежнему равна 1.
Пример с меньшими структурами
x
a1 a2 a3
b1 1 5 6
b2 3 0 0
b3 9 7 0
и y = [0.3, 0.5, 0.2]
Ожидаемый результат: [3.6, 5.9, 6]
Шаг 1: без нулей -> простое средневзвешенное значение (0.3*1+0.5*3+0.2*9 = 3.6)
Шаг 2: (b2,a2) = 0
, поэтому y
становится [0.55, 0, 0.45]
и 0.55*5+0.45*7 = 5.9
Шаг 3: (b2,a3) & (b3,a3) = 0
, поэтому y
становится [1, 0, 0]
, а общее число равно 6.
Специфичность: структура фрейма данных построена так, что при наличии 0 следующие ячейки в одной строке будут равны 0.