Я новичок в python. Как мне векторизовать или применить приведенный ниже код вместо использования double для l oop?
Было бы замечательно, если бы я мог найти решение, которое значительно сократило бы время выполнения и ускорило бы производительность. Можно ли это сделать, используя векторизация или apply
?
Каждая итерация двойного для l oop в основном заполняет запись в матрице CD_train
. Внешний для l oop проходит через столбцы, а внутренний для l oop - через ряды.
Предположим,
p = 10
N = 20
K = 11
RDA_Sigma_Hat_k_Det
- это 1 x 11
Series ,
# create a N x K matrix of zeros
CD_train = pd.DataFrame(np.zeros((N,K)),index = np.arange(N),columns = np.arange(1,K+1)) # training class discriminants
for c_i in np.arange(K):
for s_i in range(N):
# each entry is a scalar
CD_train.at[s_i,c_i+1] = -0.5 * np.log(RDA_Sigma_Hat_k_Det.iloc[c_i]) - 0.5 * (X_minus_MU.iloc[:,s_i].T).dot(SX.iloc[:,s_i])
Данные выглядят следующим образом:
RDA_Sigma_Hat_k_Det.to_dict()
Out[8]:
{1: 1.0,
2: 1.0,
3: 1.0,
4: 1.0,
5: 1.0,
6: 1.0,
7: 1.0,
8: 1.0,
9: 1.0,
10: 1.0,
11: 1.0}
SX.iloc[0:11,0:20].to_dict()
Out[2]:
{0: {'x.1': -0.6777063201168626,
'x.2': -0.9017176491315951,
'x.3': -0.21627653765171262,
'x.4': 1.8309852247892016,
'x.5': 0.2944516810197635,
'x.6': 1.3920553697352451,
'x.7': -0.6361820038552793,
'x.8': 0.03585340860595837,
'x.9': -0.882879689655477,
'x.10': -1.049097984029799},
1: {'x.1': -0.35170722429987955,
'x.2': -0.8344687172494253,
'x.3': -0.24868004543878153,
'x.4': 1.292366090376059,
'x.5': 0.1599772301293251,
'x.6': 1.8643265683002037,
'x.7': -0.5839681741154302,
'x.8': 0.003921466566276677,
'x.9': -0.4741540510775525,
'x.10': -0.4667330454332436},
2: {'x.1': 0.9094495341972316,
'x.2': -0.4913267314916866,
'x.3': -1.4395089566135637,
'x.4': -0.29226701521622966,
'x.5': -0.45278263887659,
'x.6': 1.2871062144985885,
'x.7': -1.0350956630677273,
'x.8': 0.2829058022813902,
'x.9': -0.7778711263844686,
'x.10': 0.31749458660322155},
3: {'x.1': 0.7349564284233978,
'x.2': 0.29755496943376786,
'x.3': -1.3341975563055901,
'x.4': 0.8331087124827273,
'x.5': -0.9324543915373287,
'x.6': 0.5169646194531178,
'x.7': -1.0100330247926,
'x.8': -0.4582513787449055,
'x.9': 0.38206961867066846,
'x.10': -1.0151564692036192},
4: {'x.1': 0.4100022015032635,
'x.2': 0.4087743567773565,
'x.3': -0.4539022614235512,
'x.4': 0.8981593325809331,
'x.5': -1.7365284277894346,
'x.6': 0.060127120187668165,
'x.7': 0.9970665904072039,
'x.8': -1.1052933621805605,
'x.9': 0.9765796384203767,
'x.10': -0.30238465785384777},
5: {'x.1': 0.1446055017035405,
'x.2': 0.38808237773668885,
'x.3': -0.3310389610642483,
'x.4': 0.5898193933154383,
'x.5': -1.6741433732526334,
'x.6': 0.20057378381319488,
'x.7': 0.6273926758490715,
'x.8': -1.2666337009073732,
'x.9': 0.9135745004577716,
'x.10': -0.24700639682165998},
6: {'x.1': -0.5136619033115216,
'x.2': 0.9140035116869917,
'x.3': 0.10370810174559295,
'x.4': 0.8799451589534354,
'x.5': -2.2383815331743695,
'x.6': 0.27311217052088455,
'x.7': 0.8466907607564382,
'x.8': -0.09691624513798125,
'x.9': 1.1381312742219276,
'x.10': -0.24879279233882728},
7: {'x.1': -0.9932567269653532,
'x.2': 0.7251892029408994,
'x.3': 0.8557395116371507,
'x.4': 1.8205771255734884,
'x.5': -1.9888413150271642,
'x.6': -0.20378913783392602,
'x.7': -0.734344003766196,
'x.8': 0.8139844172571485,
'x.9': 1.4580035131089988,
'x.10': -0.13267708372294978},
8: {'x.1': -0.908622346320559,
'x.2': 0.5622398679956415,
'x.3': -0.5794658540984434,
'x.4': 0.41158069424635496,
'x.5': -0.4084199334281979,
'x.6': 1.4723106060926894,
'x.7': -0.8951625993649315,
'x.8': 0.7064241914392734,
'x.9': 0.2592903754614896,
'x.10': -0.3702676875062069},
9: {'x.1': -0.6871101401885067,
'x.2': 0.300141466813851,
'x.3': -1.1721800173702455,
'x.4': 1.569481731994415,
'x.5': 0.617467630065868,
'x.6': 1.3148868732377033,
'x.7': -0.799089152643609,
'x.8': 0.32660214401990206,
'x.9': 0.6260125887310106,
'x.10': -1.0883986854074803},
10: {'x.1': -0.0434708997293346,
'x.2': 0.23720336389848712,
'x.3': -0.8521953779729399,
'x.4': 0.4753303019425965,
'x.5': -0.6288471261248959,
'x.6': 1.0201032166170922,
'x.7': -1.0267414503093515,
'x.8': 0.2879476878666032,
'x.9': 0.5000023128058007,
'x.10': -1.0651755436843047},
11: {'x.1': -0.692334484672753,
'x.2': -0.9405151098328469,
'x.3': -0.12176630660609486,
'x.4': 1.7347103070438572,
'x.5': 0.21958961557560192,
'x.6': 1.6050404200684618,
'x.7': -0.5630826422194906,
'x.8': 0.049298436833192766,
'x.9': -0.7584849300882825,
'x.10': -1.0473115885126312},
12: {'x.1': -0.25766902358344224,
'x.2': -0.8861986648510946,
'x.3': -0.4728043076326747,
'x.4': 1.2897640655721312,
'x.5': 0.17938591376299665,
'x.6': 1.8365459095610885,
'x.7': -0.6508018761824372,
'x.8': 0.4089529419117124,
'x.9': -0.7213280538539257,
'x.10': -0.17912336716930083},
13: {'x.1': 0.8937765007444923,
'x.2': -0.43959678389001744,
'x.3': -1.515117141450058,
'x.4': -0.32609333766729653,
'x.5': -0.44862363524080323,
'x.6': 1.350384381626573,
'x.7': -1.137434769357832,
'x.8': 0.3450890578323492,
'x.9': -0.9297296640379267,
'x.10': 0.3567952879809032},
14: {'x.1': 0.7171936571769593,
'x.2': 0.2760008245997389,
'x.3': -1.3449987255679463,
'x.4': 0.7927773280218399,
'x.5': -0.8049116133732016,
'x.6': 0.12494865724560347,
'x.7': -0.4398580040334463,
'x.8': -0.8565603399767243,
'x.9': 0.7213280538539257,
'x.10': -0.952632626102762},
15: {'x.1': 0.4706045975205235,
'x.2': 0.5863805102097538,
'x.3': -0.6942282775109789,
'x.4': 0.7303287327275624,
'x.5': -1.6450303478021255,
'x.6': 0.46140330197488744,
'x.7': 0.5668246333508464,
'x.8': -0.9321886237549177,
'x.9': 1.028276161876873,
'x.10': -0.7257603954225089},
16: {'x.1': 0.1717720930216222,
'x.2': 0.46481513334583135,
'x.3': -0.30808647638174114,
'x.4': 0.5585950956682996,
'x.5': -1.7864364714188756,
'x.6': 0.33021685792906585,
'x.7': 0.6858721651577027,
'x.8': -1.2851206147198204,
'x.9': 0.9426537949020508,
'x.10': -0.41314117991822313},
17: {'x.1': -0.6181487929964522,
'x.2': 0.7846786426828188,
'x.3': 0.2049690635801833,
'x.4': 1.0282605727773442,
'x.5': -2.1801554822733547,
'x.6': -0.16057477979530238,
'x.7': 0.8821961649795357,
'x.8': -0.25657595533638966,
'x.9': 1.1995208958265169,
'x.10': -0.05764847200192125},
18: {'x.1': -1.003705415933846,
'x.2': 0.6777700843060359,
'x.3': 0.8597899501105342,
'x.4': 1.8218781379754525,
'x.5': -2.1149977586460285,
'x.6': -0.2439167560126478,
'x.7': -0.7280783441974141,
'x.8': 0.9030577292625762,
'x.9': 1.4951603893433556,
'x.10': -0.11838591958561101},
19: {'x.1': -0.8281674412631627,
'x.2': 0.4398123253383578,
'x.3': -0.9318540012828176,
'x.4': 0.3048976772852978,
'x.5': -0.3737615697966416,
'x.6': 1.2022208683512918,
'x.7': -0.10568949369841144,
'x.8': 0.03417278007755406,
'x.9': 1.1623640195921603,
'x.10': -0.6310814330126395}}
X_minus_MU.iloc[0:11,0:20].to_dict()
Out[6]:
{0: {'x.1': -0.6777063201168626,
'x.2': -0.9017176491315951,
'x.3': -0.21627653765171262,
'x.4': 1.8309852247892016,
'x.5': 0.2944516810197635,
'x.6': 1.3920553697352451,
'x.7': -0.6361820038552793,
'x.8': 0.03585340860595837,
'x.9': -0.882879689655477,
'x.10': -1.049097984029799},
1: {'x.1': -0.35170722429987955,
'x.2': -0.8344687172494253,
'x.3': -0.24868004543878153,
'x.4': 1.292366090376059,
'x.5': 0.1599772301293251,
'x.6': 1.8643265683002037,
'x.7': -0.5839681741154302,
'x.8': 0.003921466566276677,
'x.9': -0.4741540510775525,
'x.10': -0.4667330454332436},
2: {'x.1': 0.9094495341972316,
'x.2': -0.4913267314916866,
'x.3': -1.4395089566135637,
'x.4': -0.29226701521622966,
'x.5': -0.45278263887659,
'x.6': 1.2871062144985885,
'x.7': -1.0350956630677273,
'x.8': 0.2829058022813902,
'x.9': -0.7778711263844686,
'x.10': 0.31749458660322155},
3: {'x.1': 0.7349564284233978,
'x.2': 0.29755496943376786,
'x.3': -1.3341975563055901,
'x.4': 0.8331087124827273,
'x.5': -0.9324543915373287,
'x.6': 0.5169646194531178,
'x.7': -1.0100330247926,
'x.8': -0.4582513787449055,
'x.9': 0.38206961867066846,
'x.10': -1.0151564692036192},
4: {'x.1': 0.4100022015032635,
'x.2': 0.4087743567773565,
'x.3': -0.4539022614235512,
'x.4': 0.8981593325809331,
'x.5': -1.7365284277894346,
'x.6': 0.060127120187668165,
'x.7': 0.9970665904072039,
'x.8': -1.1052933621805605,
'x.9': 0.9765796384203767,
'x.10': -0.30238465785384777},
5: {'x.1': 0.1446055017035405,
'x.2': 0.38808237773668885,
'x.3': -0.3310389610642483,
'x.4': 0.5898193933154383,
'x.5': -1.6741433732526334,
'x.6': 0.20057378381319488,
'x.7': 0.6273926758490715,
'x.8': -1.2666337009073732,
'x.9': 0.9135745004577716,
'x.10': -0.24700639682165998},
6: {'x.1': -0.5136619033115216,
'x.2': 0.9140035116869917,
'x.3': 0.10370810174559295,
'x.4': 0.8799451589534354,
'x.5': -2.2383815331743695,
'x.6': 0.27311217052088455,
'x.7': 0.8466907607564382,
'x.8': -0.09691624513798125,
'x.9': 1.1381312742219276,
'x.10': -0.24879279233882728},
7: {'x.1': -0.9932567269653532,
'x.2': 0.7251892029408994,
'x.3': 0.8557395116371507,
'x.4': 1.8205771255734884,
'x.5': -1.9888413150271642,
'x.6': -0.20378913783392602,
'x.7': -0.734344003766196,
'x.8': 0.8139844172571485,
'x.9': 1.4580035131089988,
'x.10': -0.13267708372294978},
8: {'x.1': -0.908622346320559,
'x.2': 0.5622398679956415,
'x.3': -0.5794658540984434,
'x.4': 0.41158069424635496,
'x.5': -0.4084199334281979,
'x.6': 1.4723106060926894,
'x.7': -0.8951625993649315,
'x.8': 0.7064241914392734,
'x.9': 0.2592903754614896,
'x.10': -0.3702676875062069},
9: {'x.1': -0.6871101401885067,
'x.2': 0.300141466813851,
'x.3': -1.1721800173702455,
'x.4': 1.569481731994415,
'x.5': 0.617467630065868,
'x.6': 1.3148868732377033,
'x.7': -0.799089152643609,
'x.8': 0.32660214401990206,
'x.9': 0.6260125887310106,
'x.10': -1.0883986854074803},
10: {'x.1': -0.0434708997293346,
'x.2': 0.23720336389848712,
'x.3': -0.8521953779729399,
'x.4': 0.4753303019425965,
'x.5': -0.6288471261248959,
'x.6': 1.0201032166170922,
'x.7': -1.0267414503093515,
'x.8': 0.2879476878666032,
'x.9': 0.5000023128058007,
'x.10': -1.0651755436843047},
11: {'x.1': -0.692334484672753,
'x.2': -0.9405151098328469,
'x.3': -0.12176630660609486,
'x.4': 1.7347103070438572,
'x.5': 0.21958961557560192,
'x.6': 1.6050404200684618,
'x.7': -0.5630826422194906,
'x.8': 0.049298436833192766,
'x.9': -0.7584849300882825,
'x.10': -1.0473115885126312},
12: {'x.1': -0.25766902358344224,
'x.2': -0.8861986648510946,
'x.3': -0.4728043076326747,
'x.4': 1.2897640655721312,
'x.5': 0.17938591376299665,
'x.6': 1.8365459095610885,
'x.7': -0.6508018761824372,
'x.8': 0.4089529419117124,
'x.9': -0.7213280538539257,
'x.10': -0.17912336716930083},
13: {'x.1': 0.8937765007444923,
'x.2': -0.43959678389001744,
'x.3': -1.515117141450058,
'x.4': -0.32609333766729653,
'x.5': -0.44862363524080323,
'x.6': 1.350384381626573,
'x.7': -1.137434769357832,
'x.8': 0.3450890578323492,
'x.9': -0.9297296640379267,
'x.10': 0.3567952879809032},
14: {'x.1': 0.7171936571769593,
'x.2': 0.2760008245997389,
'x.3': -1.3449987255679463,
'x.4': 0.7927773280218399,
'x.5': -0.8049116133732016,
'x.6': 0.12494865724560347,
'x.7': -0.4398580040334463,
'x.8': -0.8565603399767243,
'x.9': 0.7213280538539257,
'x.10': -0.952632626102762},
15: {'x.1': 0.4706045975205235,
'x.2': 0.5863805102097538,
'x.3': -0.6942282775109789,
'x.4': 0.7303287327275624,
'x.5': -1.6450303478021255,
'x.6': 0.46140330197488744,
'x.7': 0.5668246333508464,
'x.8': -0.9321886237549177,
'x.9': 1.028276161876873,
'x.10': -0.7257603954225089},
16: {'x.1': 0.1717720930216222,
'x.2': 0.46481513334583135,
'x.3': -0.30808647638174114,
'x.4': 0.5585950956682996,
'x.5': -1.7864364714188756,
'x.6': 0.33021685792906585,
'x.7': 0.6858721651577027,
'x.8': -1.2851206147198204,
'x.9': 0.9426537949020508,
'x.10': -0.41314117991822313},
17: {'x.1': -0.6181487929964522,
'x.2': 0.7846786426828188,
'x.3': 0.2049690635801833,
'x.4': 1.0282605727773442,
'x.5': -2.1801554822733547,
'x.6': -0.16057477979530238,
'x.7': 0.8821961649795357,
'x.8': -0.25657595533638966,
'x.9': 1.1995208958265169,
'x.10': -0.05764847200192125},
18: {'x.1': -1.003705415933846,
'x.2': 0.6777700843060359,
'x.3': 0.8597899501105342,
'x.4': 1.8218781379754525,
'x.5': -2.1149977586460285,
'x.6': -0.2439167560126478,
'x.7': -0.7280783441974141,
'x.8': 0.9030577292625762,
'x.9': 1.4951603893433556,
'x.10': -0.11838591958561101},
19: {'x.1': -0.8281674412631627,
'x.2': 0.4398123253383578,
'x.3': -0.9318540012828176,
'x.4': 0.3048976772852978,
'x.5': -0.3737615697966416,
'x.6': 1.2022208683512918,
'x.7': -0.10568949369841144,
'x.8': 0.03417278007755406,
'x.9': 1.1623640195921603,
'x.10': -0.6310814330126395}}
Обновление: Я понял, что всегда должен использовать массивы numpy, когда дело доходит до матричные операции с циклами, потому что это намного быстрее по сравнению с pandas dataaframe / series. Это значительно ускоряет всю функцию, хотя все еще медленно.