Способ отобразить один массив на другой в NumPy? - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть 2-й массив и 1-й массив, как показано ниже.То, что я хотел бы сделать, это заполнить пустые места в массиве 2-й произведением массива 2-го и 1-го, вероятно, проще всего продемонстрировать ниже:

all_holdings = np.array([[1, 0, 0, 2, 0],
                         [2, 0, 0, 1, 0]]).astype('float64')
sub_holdings = np.array([0.2, 0.3, 0.5])

Для чегоЯ бы хотел, чтобы желаемый результат был:

array([[1. , 0.2, 0.3, 2. , 1. ],
       [2. , 0.4, 0.6, 1. , 0.5]])

, т. Е. (Работа, показанная здесь):

array([[1., 1*0.2, 1*0.3, 2, 2*0.5],
       [2., 2*0.2, 2*0.3, 1, 1*0.5]])

Может ли кто-нибудь придумать относительно быстрый, предпочтительно векторизованный способсделай это?Я должен выполнить этот расчет несколько раз для ряда двумерных массивов, хотя всегда с пробелами в одном и том же месте в двумерном массиве.

Заранее спасибо (и впоследствии)

1 Ответ

0 голосов
/ 20 февраля 2019
In [76]: all_holdings = np.array([[1, 0, 0, 2, 0], 
    ...:                          [2, 0, 0, 1, 0]]).astype('float64') 
    ...: sub_holdings = np.array([0.2, 0.3, 0.5])                               

С одним уровнем итерации:

In [77]: idx = np.where(all_holdings[0,:]==0)[0]                                
In [78]: idx                                                                    
Out[78]: array([1, 2, 4])
In [79]: res = all_holdings.copy()                                              
In [80]: for i,j in zip(idx, sub_holdings): 
    ...:     res[:,i] = res[:,i-1]*j 
    ...:                                                                        
In [81]: res                                                                    
Out[81]: 
array([[1.  , 0.2 , 0.06, 2.  , 1.  ],
       [2.  , 0.4 , 0.12, 1.  , 0.5 ]])

Упс, неправильный столбец res[:,2];Мне нужно использовать что-то, кроме idx-1.

Теперь я могу лучше визуализировать действие.Например, все новые значения:

In [82]: res[:,idx]                                                             
Out[82]: 
array([[0.2 , 0.06, 1.  ],
       [0.4 , 0.12, 0.5 ]])

ОК, мне нужен способ правильного сопряжения каждого из значений idx с правым ненулевым столбцом.

In [84]: jdx = np.where(all_holdings[0,:])[0]                                   
In [85]: jdx                                                                    
Out[85]: array([0, 3])

Это не урезает.

Но давайте предположим, что у нас есть правильное jdx.

In [87]: jdx = np.array([0,0,3])                                                
In [88]: res = all_holdings.copy()                                              
In [89]: for i,j,v in zip(idx,jdx, sub_holdings): 
    ...:     res[:,i] = res[:,j]*v 
    ...:                                                                        
In [90]: res                                                                    
Out[90]: 
array([[1. , 0.2, 0.3, 2. , 1. ],
       [2. , 0.4, 0.6, 1. , 0.5]])
In [91]: res[:,idx]                                                             
Out[91]: 
array([[0.2, 0.3, 1. ],
       [0.4, 0.6, 0.5]])

Я получаю те же значения без итерации:

In [92]: all_holdings[:,jdx]*sub_holdings                                       
Out[92]: 
array([[0.2, 0.3, 1. ],
       [0.4, 0.6, 0.5]])

In [94]: res[:,idx] = res[:,jdx] *sub_holdings                                  
In [95]: res                                                                    
Out[95]: 
array([[1. , 0.2, 0.3, 2. , 1. ],
       [2. , 0.4, 0.6, 1. , 0.5]])

Таким образом, ключ, чтобы найти правильный jdx массив.Я это до вас!

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