如何使用 NumPy 有效地计算行的成对比率?
How to efficiently calculate pairwise ratios on rows using NumPy?
我正在尝试加快计算成对值的速度。但是,我无法想象如何在 NumPy 中执行此操作而又不会过于冗长和明确。
有没有办法使用向量乘法或广播来加速这个操作?
基本上我所做的是遍历每一行,然后遍历每行中的所有特征组合,然后取比率(然后是对数变换)。
import pandas as pd
import numpy as np
from collections import *
# Get data
data = {'BC0a': {'1001.2': 4122,'1010.1': 6766,'1010.2': 11734,'1018.2': 5805,'1021.2': 9504,'1026.1': 18111,'1026.2': 1350,'1029.1': 3638,'1029.2': 3967,'1048.2': 9225,'1049.2': 8670,'1057.2': 21796,'1065.1': 5117,'1065.2': 7811,'1067.1': 17563,'1067.2': 8418,'1071.1': 10088,'1071.2': 9878,'1072.1': 13159,'1072.2': 8358,'1073.1': 5368,'1073.2': 2615,'1080.2': 9397,'1086.2': 1303,'2018.1': 2414,'2018.2': 1771,'2028.2': 13710,'2031.2': 3264,'2034.1': 10264,'2034.2': 4670,'2036.1': 7219,'2050.2': 11707,'3038.1': 1388,'3038.2': 13104,'3041.1': 4085,'3041.2': 9160,'3042.1': 8629,'3042.2': 11298,'A-1501-03.A': 4083,'A-1501-03.B': 7952,'A-1505-99.A': 4714,'A-1505-99.B': 4938,'A-1507-168.B': 9238,'M-1506-106.B': 10223,'M-1506-108.A': 2704,'M-1506-108.B': 5056,'M-1506-110.A': 20939,'M-1506-110.B': 18435,'M-1507-113.B': 23343,'M-1507-118.A': 5895,'M-1507-118.B': 5758,'M-1507-119.A': 4404,'M-1507-119.B': 5842,'M-1507-120.A': 9952,'M-1507-120.B': 7825,'M-1507-124.A': 12450,'M-1507-125.B': 28041,'M-1507-126.A': 7669,'M-1507-133.B': 4964,'M-1507-134.B': 1380,'M-1507-136.A': 5557,'M-1507-147.A': 3113,'M-1507-147.B': 1340,'M-1507-154.A': 2848,'M-1507-154.B': 17416,'M-1507-155.A': 5535,'M-1507-155.B': 3792,'S-1409-41.B': 3476,'S-1409-52.B': 3584,'S-1409-57.A': 2065,'S-1410-61.B': 10758,'S-1410-62.A': 5886,'S-1410-62.B': 7680,'S-1410-67.A': 4104,'S-1410-70.A': 2970,'S-1410-70.B': 9990,'S-1410-71.A': 14024,'S-1410-71.B': 11120,'S-1410-72.A': 9835,'S-1410-72.B': 7124,'S-1410-75.A': 1693,'S-1410-75.B': 3334,'S-1410-76.A': 3849,'S-1410-76.B': 12268,'S-1410-84.A': 16988,'S-1410-84.B': 19123,'S-1504-86.A': 15359},'BC0b': {'1001.2': 5935,'1010.1': 34253,'1010.2': 8016,'1018.2': 7557,'1021.2': 25213,'1026.1': 5462,'1026.2': 742,'1029.1': 11265,'1029.2': 2133,'1048.2': 7906,'1049.2': 27375,'1057.2': 7353,'1065.1': 8505,'1065.2': 18643,'1067.1': 22754,'1067.2': 7441,'1071.1': 15505,'1071.2': 18355,'1072.1': 9349,'1072.2': 21841,'1073.1': 8474,'1073.2': 6273,'1080.2': 7820,'1086.2': 2231,'2018.1': 1978,'2018.2': 6516,'2028.2': 12559,'2031.2': 2537,'2034.1': 13301,'2034.2': 3128,'2036.1': 12757,'2050.2': 17553,'3038.1': 1286,'3038.2': 13197,'3041.1': 11141,'3041.2': 19938,'3042.1': 11437,'3042.2': 12662,'A-1501-03.A': 36185,'A-1501-03.B': 38130,'A-1505-99.A': 16054,'A-1505-99.B': 14821,'A-1507-168.B': 26276,'M-1506-106.B': 9390,'M-1506-108.A': 8822,'M-1506-108.B': 10076,'M-1506-110.A': 32208,'M-1506-110.B': 31193,'M-1507-113.B': 72979,'M-1507-118.A': 5367,'M-1507-118.B': 4684,'M-1507-119.A': 66612,'M-1507-119.B': 13348,'M-1507-120.A': 33713,'M-1507-120.B': 8025,'M-1507-124.A': 16145,'M-1507-125.B': 28633,'M-1507-126.A': 18907,'M-1507-133.B': 4885,'M-1507-134.B': 42507,'M-1507-136.A': 17102,'M-1507-147.A': 5015,'M-1507-147.B': 114078,'M-1507-154.A': 16207,'M-1507-154.B': 12175,'M-1507-155.A': 9714,'M-1507-155.B': 14034,'S-1409-41.B': 4865,'S-1409-52.B': 2994,'S-1409-57.A': 3328,'S-1410-61.B': 12545,'S-1410-62.A': 12655,'S-1410-62.B': 3591,'S-1410-67.A': 3109,'S-1410-70.A': 14745,'S-1410-70.B': 16226,'S-1410-71.A': 3979,'S-1410-71.B': 2415,'S-1410-72.A': 25956,'S-1410-72.B': 19851,'S-1410-75.A': 5027,'S-1410-75.B': 1560,'S-1410-76.A': 28781,'S-1410-76.B': 11400,'S-1410-84.A': 15048,'S-1410-84.B': 5149,'S-1504-86.A': 15101},'BC1': {'1001.2': 289306,'1010.1': 161496,'1010.2': 69964,'1018.2': 47739,'1021.2': 124848,'1026.1': 68643,'1026.2': 17652,'1029.1': 35123,'1029.2': 131421,'1048.2': 178320,'1049.2': 97477,'1057.2': 72803,'1065.1': 66952,'1065.2': 116619,'1067.1': 70103,'1067.2': 60019,'1071.1': 355549,'1071.2': 253142,'1072.1': 72188,'1072.2': 181514,'1073.1': 132905,'1073.2': 123315,'1080.2': 105312,'1086.2': 26294,'2018.1': 63484,'2018.2': 341118,'2028.2': 65058,'2031.2': 140441,'2034.1': 84939,'2034.2': 49515,'2036.1': 145002,'2050.2': 103857,'3038.1': 13941,'3038.2': 79499,'3041.1': 42726,'3041.2': 124551,'3042.1': 40899,'3042.2': 40565,'A-1501-03.A': 137056,'A-1501-03.B': 166252,'A-1505-99.A': 202502,'A-1505-99.B': 61795,'A-1507-168.B': 144826,'M-1506-106.B': 92482,'M-1506-108.A': 134468,'M-1506-108.B': 167032,'M-1506-110.A': 101216,'M-1506-110.B': 100130,'M-1507-113.B': 156389,'M-1507-118.A': 178511,'M-1507-118.B': 114049,'M-1507-119.A': 127491,'M-1507-119.B': 96218,'M-1507-120.A': 227099,'M-1507-120.B': 97021,'M-1507-124.A': 63121,'M-1507-125.B': 126164,'M-1507-126.A': 62577,'M-1507-133.B': 33532,'M-1507-134.B': 104437,'M-1507-136.A': 25218,'M-1507-147.A': 180090,'M-1507-147.B': 67312,'M-1507-154.A': 78943,'M-1507-154.B': 73775,'M-1507-155.A': 111586,'M-1507-155.B': 146237,'S-1409-41.B': 134373,'S-1409-52.B': 122611,'S-1409-57.A': 139990,'S-1410-61.B': 326334,'S-1410-62.A': 360458,'S-1410-62.B': 448642,'S-1410-67.A': 250696,'S-1410-70.A': 72425,'S-1410-70.B': 192340,'S-1410-71.A': 113476,'S-1410-71.B': 160124,'S-1410-72.A': 82178,'S-1410-72.B': 118238,'S-1410-75.A': 70348,'S-1410-75.B': 277236,'S-1410-76.A': 130693,'S-1410-76.B': 256835,'S-1410-84.A': 103621,'S-1410-84.B': 56052,'S-1504-86.A': 108613},'BC10': {'1001.2': 33754,'1010.1': 16476,'1010.2': 8935,'1018.2': 1221,'1021.2': 80753,'1026.1': 716,'1026.2': 334,'1029.1': 1008,'1029.2': 1008,'1048.2': 8115,'1049.2': 27643,'1057.2': 6681,'1065.1': 1020,'1065.2': 1269,'1067.1': 5771,'1067.2': 1800,'1071.1': 4905,'1071.2': 6513,'1072.1': 12068,'1072.2': 22154,'1073.1': 889,'1073.2': 380,'1080.2': 5208,'1086.2': 1359,'2018.1': 1577,'2018.2': 5306,'2028.2': 2675,'2031.2': 1284,'2034.1': 2081,'2034.2': 1229,'2036.1': 2548,'2050.2': 4020,'3038.1': 334,'3038.2': 943,'3041.1': 429,'3041.2': 3665,'3042.1': 845,'3042.2': 1700,'A-1501-03.A': 2357,'A-1501-03.B': 2798,'A-1505-99.A': 3528,'A-1505-99.B': 1093,'A-1507-168.B': 13760,'M-1506-106.B': 2380,'M-1506-108.A': 8673,'M-1506-108.B': 7305,'M-1506-110.A': 12250,'M-1506-110.B': 9403,'M-1507-113.B': 56811,'M-1507-118.A': 9763,'M-1507-118.B': 3591,'M-1507-119.A': 15052,'M-1507-119.B': 2156,'M-1507-120.A': 13108,'M-1507-120.B': 3872,'M-1507-124.A': 5413,'M-1507-125.B': 15676,'M-1507-126.A': 5279,'M-1507-133.B': 5271,'M-1507-134.B': 1087,'M-1507-136.A': 3641,'M-1507-147.A': 4673,'M-1507-147.B': 1316,'M-1507-154.A': 6519,'M-1507-154.B': 3229,'M-1507-155.A': 5602,'M-1507-155.B': 10569,'S-1409-41.B': 2057,'S-1409-52.B': 1593,'S-1409-57.A': 13432,'S-1410-61.B': 7979,'S-1410-62.A': 5516,'S-1410-62.B': 1783,'S-1410-67.A': 6542,'S-1410-70.A': 4102,'S-1410-70.B': 6543,'S-1410-71.A': 22790,'S-1410-71.B': 12016,'S-1410-72.A': 11283,'S-1410-72.B': 1319,'S-1410-75.A': 1938,'S-1410-75.B': 2400,'S-1410-76.A': 2461,'S-1410-76.B': 10497,'S-1410-84.A': 5015,'S-1410-84.B': 1202,'S-1504-86.A': 57069},'BC100': {'1001.2': 3286,'1010.1': 10947,'1010.2': 7687,'1018.2': 2765,'1021.2': 38762,'1026.1': 33677,'1026.2': 13154,'1029.1': 5563,'1029.2': 9174,'1048.2': 13501,'1049.2': 23698,'1057.2': 3075,'1065.1': 18148,'1065.2': 24837,'1067.1': 8748,'1067.2': 11369,'1071.1': 4122,'1071.2': 41568,'1072.1': 67820,'1072.2': 42658,'1073.1': 12069,'1073.2': 38510,'1080.2': 25111,'1086.2': 3059,'2018.1': 11287,'2018.2': 46781,'2028.2': 12872,'2031.2': 43654,'2034.1': 12293,'2034.2': 4663,'2036.1': 7529,'2050.2': 26721,'3038.1': 5641,'3038.2': 27469,'3041.1': 18354,'3041.2': 24639,'3042.1': 14481,'3042.2': 19247,'A-1501-03.A': 39180,'A-1501-03.B': 58928,'A-1505-99.A': 16431,'A-1505-99.B': 17782,'A-1507-168.B': 26221,'M-1506-106.B': 2450,'M-1506-108.A': 35528,'M-1506-108.B': 45668,'M-1506-110.A': 47633,'M-1506-110.B': 76327,'M-1507-113.B': 16337,'M-1507-118.A': 2003,'M-1507-118.B': 80529,'M-1507-119.A': 33802,'M-1507-119.B': 59446,'M-1507-120.A': 29498,'M-1507-120.B': 24406,'M-1507-124.A': 2117,'M-1507-125.B': 42188,'M-1507-126.A': 12968,'M-1507-133.B': 15551,'M-1507-134.B': 72534,'M-1507-136.A': 5452,'M-1507-147.A': 311,'M-1507-147.B': 102750,'M-1507-154.A': 18811,'M-1507-154.B': 14461,'M-1507-155.A': 4477,'M-1507-155.B': 6166,'S-1409-41.B': 3421,'S-1409-52.B': 6475,'S-1409-57.A': 140259,'S-1410-61.B': 17793,'S-1410-62.A': 74388,'S-1410-62.B': 21366,'S-1410-67.A': 5405,'S-1410-70.A': 65814,'S-1410-70.B': 155655,'S-1410-71.A': 10657,'S-1410-71.B': 8941,'S-1410-72.A': 6123,'S-1410-72.B': 24783,'S-1410-75.A': 2620,'S-1410-75.B': 337,'S-1410-76.A': 45598,'S-1410-76.B': 5859,'S-1410-84.A': 9742,'S-1410-84.B': 20088,'S-1504-86.A': 5997},'BC101': {'1001.2': 12807,'1010.1': 16089,'1010.2': 28135,'1018.2': 7601,'1021.2': 29398,'1026.1': 8161,'1026.2': 2873,'1029.1': 3002,'1029.2': 23365,'1048.2': 24211,'1049.2': 12970,'1057.2': 18223,'1065.1': 5070,'1065.2': 15738,'1067.1': 11808,'1067.2': 18002,'1071.1': 10263,'1071.2': 20660,'1072.1': 30239,'1072.2': 23493,'1073.1': 9962,'1073.2': 9259,'1080.2': 57914,'1086.2': 10509,'2018.1': 8176,'2018.2': 13699,'2028.2': 23270,'2031.2': 11688,'2034.1': 7456,'2034.2': 4892,'2036.1': 5897,'2050.2': 24212,'3038.1': 822,'3038.2': 8498,'3041.1': 3023,'3041.2': 12399,'3042.1': 3497,'3042.2': 11858,'A-1501-03.A': 2538,'A-1501-03.B': 4517,'A-1505-99.A': 3186,'A-1505-99.B': 6374,'A-1507-168.B': 9800,'M-1506-106.B': 9571,'M-1506-108.A': 7972,'M-1506-108.B': 12036,'M-1506-110.A': 21647,'M-1506-110.B': 18908,'M-1507-113.B': 13387,'M-1507-118.A': 20837,'M-1507-118.B': 35744,'M-1507-119.A': 6812,'M-1507-119.B': 13414,'M-1507-120.A': 24473,'M-1507-120.B': 9791,'M-1507-124.A': 30794,'M-1507-125.B': 29891,'M-1507-126.A': 9887,'M-1507-133.B': 7909,'M-1507-134.B': 3400,'M-1507-136.A': 5674,'M-1507-147.A': 74549,'M-1507-147.B': 2853,'M-1507-154.A': 5432,'M-1507-154.B': 23947,'M-1507-155.A': 5888,'M-1507-155.B': 4172,'S-1409-41.B': 14725,'S-1409-52.B': 19069,'S-1409-57.A': 12003,'S-1410-61.B': 21601,'S-1410-62.A': 18475,'S-1410-62.B': 21780,'S-1410-67.A': 30727,'S-1410-70.A': 3549,'S-1410-70.B': 21779,'S-1410-71.A': 185412,'S-1410-71.B': 78044,'S-1410-72.A': 8771,'S-1410-72.B': 1100,'S-1410-75.A': 6739,'S-1410-75.B': 53418,'S-1410-76.A': 24381,'S-1410-76.B': 68226,'S-1410-84.A': 12141,'S-1410-84.B': 4067,'S-1504-86.A': 12996},'BC102': {'1001.2': 11219,'1010.1': 6212,'1010.2': 5608,'1018.2': 771,'1021.2': 4191,'1026.1': 1567,'1026.2': 378,'1029.1': 584,'1029.2': 534,'1048.2': 3344,'1049.2': 27804,'1057.2': 179,'1065.1': 2359,'1065.2': 6919,'1067.1': 2335,'1067.2': 301,'1071.1': 1975,'1071.2': 4508,'1072.1': 6226,'1072.2': 6786,'1073.1': 5397,'1073.2': 1984,'1080.2': 422,'1086.2': 261,'2018.1': 700,'2018.2': 298,'2028.2': 1575,'2031.2': 4126,'2034.1': 5626,'2034.2': 972,'2036.1': 773,'2050.2': 9878,'3038.1': 462,'3038.2': 1571,'3041.1': 5059,'3041.2': 3557,'3042.1': 35644,'3042.2': 9463,'A-1501-03.A': 997,'A-1501-03.B': 8698,'A-1505-99.A': 1430,'A-1505-99.B': 2856,'A-1507-168.B': 2674,'M-1506-106.B': 380,'M-1506-108.A': 6261,'M-1506-108.B': 4569,'M-1506-110.A': 3987,'M-1506-110.B': 2212,'M-1507-113.B': 391,'M-1507-118.A': 411,'M-1507-118.B': 2462,'M-1507-119.A': 2932,'M-1507-119.B': 5597,'M-1507-120.A': 8961,'M-1507-120.B': 4788,'M-1507-124.A': 2628,'M-1507-125.B': 2169,'M-1507-126.A': 3431,'M-1507-133.B': 4702,'M-1507-134.B': 667,'M-1507-136.A': 5041,'M-1507-147.A': 152,'M-1507-147.B': 819,'M-1507-154.A': 233,'M-1507-154.B': 8963,'M-1507-155.A': 2123,'M-1507-155.B': 1654,'S-1409-41.B': 1625,'S-1409-52.B': 2464,'S-1409-57.A': 3097,'S-1410-61.B': 4198,'S-1410-62.A': 4627,'S-1410-62.B': 652,'S-1410-67.A': 682,'S-1410-70.A': 1507,'S-1410-70.B': 2692,'S-1410-71.A': 8955,'S-1410-71.B': 3057,'S-1410-72.A': 5078,'S-1410-72.B': 4436,'S-1410-75.A': 2217,'S-1410-75.B': 76,'S-1410-76.A': 2578,'S-1410-76.B': 1591,'S-1410-84.A': 430,'S-1410-84.B': 3293,'S-1504-86.A': 1022},'BC103': {'1001.2': 47,'1010.1': 4121,'1010.2': 2117,'1018.2': 2568,'1021.2': 25001,'1026.1': 2212,'1026.2': 1535,'1029.1': 4580,'1029.2': 1152,'1048.2': 8221,'1049.2': 27980,'1057.2': 1380,'1065.1': 11013,'1065.2': 23179,'1067.1': 3541,'1067.2': 2241,'1071.1': 9779,'1071.2': 15474,'1072.1': 8528,'1072.2': 10340,'1073.1': 5147,'1073.2': 14658,'1080.2': 2112,'1086.2': 406,'2018.1': 5170,'2018.2': 30349,'2028.2': 6192,'2031.2': 5190,'2034.1': 12565,'2034.2': 2884,'2036.1': 6942,'2050.2': 17112,'3038.1': 540,'3038.2': 11259,'3041.1': 4713,'3041.2': 14039,'3042.1': 31265,'3042.2': 23319,'A-1501-03.A': 6818,'A-1501-03.B': 14055,'A-1505-99.A': 8326,'A-1505-99.B': 9245,'A-1507-168.B': 6074,'M-1506-106.B': 2501,'M-1506-108.A': 19348,'M-1506-108.B': 40895,'M-1506-110.A': 26179,'M-1506-110.B': 10612,'M-1507-113.B': 7493,'M-1507-118.A': 2033,'M-1507-118.B': 17832,'M-1507-119.A': 69373,'M-1507-119.B': 10119,'M-1507-120.A': 10813,'M-1507-120.B': 1515,'M-1507-124.A': 5464,'M-1507-125.B': 3609,'M-1507-126.A': 1456,'M-1507-133.B': 6704,'M-1507-134.B': 22506,'M-1507-136.A': 2103,'M-1507-147.A': 2314,'M-1507-147.B': 40975,'M-1507-154.A': 10102,'M-1507-154.B': 9181,'M-1507-155.A': 8766,'M-1507-155.B': 3702,'S-1409-41.B': 2009,'S-1409-52.B': 4647,'S-1409-57.A': 12433,'S-1410-61.B': 10995,'S-1410-62.A': 24021,'S-1410-62.B': 15828,'S-1410-67.A': 1468,'S-1410-70.A': 28608,'S-1410-70.B': 24070,'S-1410-71.A': 9840,'S-1410-71.B': 1263,'S-1410-72.A': 10484,'S-1410-72.B': 13375,'S-1410-75.A': 3502,'S-1410-75.B': 207,'S-1410-76.A': 14776,'S-1410-76.B': 659,'S-1410-84.A': 9886,'S-1410-84.B': 8042,'S-1504-86.A': 14472},'BC104': {'1001.2': 0,'1010.1': 35,'1010.2': 313,'1018.2': 35,'1021.2': 9,'1026.1': 288,'1026.2': 1,'1029.1': 0,'1029.2': 0,'1048.2': 12,'1049.2': 415,'1057.2': 37,'1065.1': 162,'1065.2': 241,'1067.1': 47,'1067.2': 22,'1071.1': 6,'1071.2': 0,'1072.1': 1,'1072.2': 7,'1073.1': 1,'1073.2': 0,'1080.2': 0,'1086.2': 0,'2018.1': 10,'2018.2': 129,'2028.2': 127,'2031.2': 57,'2034.1': 12,'2034.2': 0,'2036.1': 64,'2050.2': 64,'3038.1': 0,'3038.2': 449,'3041.1': 0,'3041.2': 20,'3042.1': 3,'3042.2': 7620,'A-1501-03.A': 21,'A-1501-03.B': 49,'A-1505-99.A': 17,'A-1505-99.B': 0,'A-1507-168.B': 0,'M-1506-106.B': 0,'M-1506-108.A': 767,'M-1506-108.B': 407,'M-1506-110.A': 1,'M-1506-110.B': 3,'M-1507-113.B': 2069,'M-1507-118.A': 2,'M-1507-118.B': 110,'M-1507-119.A': 3081,'M-1507-119.B': 1222,'M-1507-120.A': 1340,'M-1507-120.B': 151,'M-1507-124.A': 0,'M-1507-125.B': 1,'M-1507-126.A': 0,'M-1507-133.B': 1012,'M-1507-134.B': 8,'M-1507-136.A': 8,'M-1507-147.A': 385,'M-1507-147.B': 4,'M-1507-154.A': 205,'M-1507-154.B': 24,'M-1507-155.A': 0,'M-1507-155.B': 349,'S-1409-41.B': 3,'S-1409-52.B': 640,'S-1409-57.A': 3,'S-1410-61.B': 3,'S-1410-62.A': 226,'S-1410-62.B': 12,'S-1410-67.A': 33,'S-1410-70.A': 0,'S-1410-70.B': 2965,'S-1410-71.A': 0,'S-1410-71.B': 0,'S-1410-72.A': 4,'S-1410-72.B': 54,'S-1410-75.A': 218,'S-1410-75.B': 170,'S-1410-76.A': 99,'S-1410-76.B': 481,'S-1410-84.A': 0,'S-1410-84.B': 9,'S-1504-86.A': 0},'BC105': {'1001.2': 0,'1010.1': 3813,'1010.2': 5828,'1018.2': 232,'1021.2': 412,'1026.1': 4,'1026.2': 13,'1029.1': 95,'1029.2': 8,'1048.2': 2127,'1049.2': 9956,'1057.2': 18,'1065.1': 469,'1065.2': 2961,'1067.1': 988,'1067.2': 439,'1071.1': 14668,'1071.2': 3951,'1072.1': 415,'1072.2': 182,'1073.1': 1288,'1073.2': 74,'1080.2': 122,'1086.2': 696,'2018.1': 21,'2018.2': 173,'2028.2': 3865,'2031.2': 59,'2034.1': 1097,'2034.2': 255,'2036.1': 1710,'2050.2': 8870,'3038.1': 307,'3038.2': 445,'3041.1': 984,'3041.2': 5100,'3042.1': 1481,'3042.2': 139,'A-1501-03.A': 351,'A-1501-03.B': 1183,'A-1505-99.A': 11933,'A-1505-99.B': 4359,'A-1507-168.B': 8246,'M-1506-106.B': 980,'M-1506-108.A': 699,'M-1506-108.B': 4191,'M-1506-110.A': 3477,'M-1506-110.B': 36780,'M-1507-113.B': 8960,'M-1507-118.A': 543,'M-1507-118.B': 324,'M-1507-119.A': 7886,'M-1507-119.B': 1448,'M-1507-120.A': 15303,'M-1507-120.B': 1669,'M-1507-124.A': 9443,'M-1507-125.B': 3264,'M-1507-126.A': 430,'M-1507-133.B': 176,'M-1507-134.B': 952,'M-1507-136.A': 163,'M-1507-147.A': 310,'M-1507-147.B': 16023,'M-1507-154.A': 1068,'M-1507-154.B': 2703,'M-1507-155.A': 71589,'M-1507-155.B': 351,'S-1409-41.B': 956,'S-1409-52.B': 85,'S-1409-57.A': 168,'S-1410-61.B': 1492,'S-1410-62.A': 1215,'S-1410-62.B': 562,'S-1410-67.A': 218,'S-1410-70.A': 925,'S-1410-70.B': 643,'S-1410-71.A': 87,'S-1410-71.B': 428,'S-1410-72.A': 232,'S-1410-72.B': 973,'S-1410-75.A': 11737,'S-1410-75.B': 21,'S-1410-76.A': 1169,'S-1410-76.B': 1833,'S-1410-84.A': 108,'S-1410-84.B': 6469,'S-1504-86.A': 13818}}
X = pd.DataFrame(data) + 1
# Shape of X where rows are samples and columns are features
n,m = X.shape
index_samples = X.index
index_features = X.columns
X_values = X.values
# A = np.empty((n, m**2 - m))
# A[:] = np.nan
# Not the most efficient way but the best way to show what I'm trying to do
A = defaultdict(dict)
for row_pos, a in enumerate(X_values):
id_sample = index_samples[row_pos]
# col_pos = 0
for i in range(m):
a_i = a[i]
i_feature = index_features[i]
for j in range( m):
if i != j:
a_j = a[j]
j_feature = index_features[j]
# A[row_pos, col_pos] = a_i - a_j
A[id_sample]["{}/{}".format(i_feature, j_feature)] = np.log(a_i/a_j)
# col_pos += 1
df = pd.DataFrame(A).T
df.iloc[:5,:5]
BC0a/BC0b BC0a/BC1 BC0a/BC10 BC0a/BC100 BC0a/BC101
1001.2 -0.364454 -4.250907 -2.102548 0.226606 -1.133489
1010.1 -1.621745 -3.172429 -0.889908 -0.481099 -0.866140
1010.2 0.381012 -1.785419 0.272488 0.422915 -0.874474
1018.2 -0.263715 -2.106878 1.558403 0.741490 -0.269520
1021.2 -0.975581 -2.575287 -2.139590 -1.405648 -1.129143
您可以使用np.triu_indices
通过索引得到所有可能的组合:
i_index, j_index = np.triu_indices(m, 1)
利用对数的发明可以做到 log(a / b) = log(a) - log(b)
,您现在可以做到:
df = pd.DataFrame(data=np.log(X_values[:, i_index]) - np.log(X_values[:, j_index]),
index=X.index.copy(), columns=[f'{a}/{b}' for a, b in zip(X.columns[i_index], X.columns[j_index])])
虽然在我看来它更优雅,但您可以轻松地保持比率的原始公式:
np.log(X_values[:, i_index] / X_values[:, j_index])
请注意,这是您的答案包含的一半数据。另一半只是反比,在对数 table 中显示为负数。如果你绝对坚持计算这些(即使它很浪费),你可以相应地调整 i_index
和 j_index
:
i_index = np.repeat(np.arange(m), m - 1)
j_index = np.delete(np.tile(np.arange(m), m), slice(None, None, m + 1))
无论哪种方式,您的整个代码都可以用大约三行来表达。
我正在尝试加快计算成对值的速度。但是,我无法想象如何在 NumPy 中执行此操作而又不会过于冗长和明确。
有没有办法使用向量乘法或广播来加速这个操作?
基本上我所做的是遍历每一行,然后遍历每行中的所有特征组合,然后取比率(然后是对数变换)。
import pandas as pd
import numpy as np
from collections import *
# Get data
data = {'BC0a': {'1001.2': 4122,'1010.1': 6766,'1010.2': 11734,'1018.2': 5805,'1021.2': 9504,'1026.1': 18111,'1026.2': 1350,'1029.1': 3638,'1029.2': 3967,'1048.2': 9225,'1049.2': 8670,'1057.2': 21796,'1065.1': 5117,'1065.2': 7811,'1067.1': 17563,'1067.2': 8418,'1071.1': 10088,'1071.2': 9878,'1072.1': 13159,'1072.2': 8358,'1073.1': 5368,'1073.2': 2615,'1080.2': 9397,'1086.2': 1303,'2018.1': 2414,'2018.2': 1771,'2028.2': 13710,'2031.2': 3264,'2034.1': 10264,'2034.2': 4670,'2036.1': 7219,'2050.2': 11707,'3038.1': 1388,'3038.2': 13104,'3041.1': 4085,'3041.2': 9160,'3042.1': 8629,'3042.2': 11298,'A-1501-03.A': 4083,'A-1501-03.B': 7952,'A-1505-99.A': 4714,'A-1505-99.B': 4938,'A-1507-168.B': 9238,'M-1506-106.B': 10223,'M-1506-108.A': 2704,'M-1506-108.B': 5056,'M-1506-110.A': 20939,'M-1506-110.B': 18435,'M-1507-113.B': 23343,'M-1507-118.A': 5895,'M-1507-118.B': 5758,'M-1507-119.A': 4404,'M-1507-119.B': 5842,'M-1507-120.A': 9952,'M-1507-120.B': 7825,'M-1507-124.A': 12450,'M-1507-125.B': 28041,'M-1507-126.A': 7669,'M-1507-133.B': 4964,'M-1507-134.B': 1380,'M-1507-136.A': 5557,'M-1507-147.A': 3113,'M-1507-147.B': 1340,'M-1507-154.A': 2848,'M-1507-154.B': 17416,'M-1507-155.A': 5535,'M-1507-155.B': 3792,'S-1409-41.B': 3476,'S-1409-52.B': 3584,'S-1409-57.A': 2065,'S-1410-61.B': 10758,'S-1410-62.A': 5886,'S-1410-62.B': 7680,'S-1410-67.A': 4104,'S-1410-70.A': 2970,'S-1410-70.B': 9990,'S-1410-71.A': 14024,'S-1410-71.B': 11120,'S-1410-72.A': 9835,'S-1410-72.B': 7124,'S-1410-75.A': 1693,'S-1410-75.B': 3334,'S-1410-76.A': 3849,'S-1410-76.B': 12268,'S-1410-84.A': 16988,'S-1410-84.B': 19123,'S-1504-86.A': 15359},'BC0b': {'1001.2': 5935,'1010.1': 34253,'1010.2': 8016,'1018.2': 7557,'1021.2': 25213,'1026.1': 5462,'1026.2': 742,'1029.1': 11265,'1029.2': 2133,'1048.2': 7906,'1049.2': 27375,'1057.2': 7353,'1065.1': 8505,'1065.2': 18643,'1067.1': 22754,'1067.2': 7441,'1071.1': 15505,'1071.2': 18355,'1072.1': 9349,'1072.2': 21841,'1073.1': 8474,'1073.2': 6273,'1080.2': 7820,'1086.2': 2231,'2018.1': 1978,'2018.2': 6516,'2028.2': 12559,'2031.2': 2537,'2034.1': 13301,'2034.2': 3128,'2036.1': 12757,'2050.2': 17553,'3038.1': 1286,'3038.2': 13197,'3041.1': 11141,'3041.2': 19938,'3042.1': 11437,'3042.2': 12662,'A-1501-03.A': 36185,'A-1501-03.B': 38130,'A-1505-99.A': 16054,'A-1505-99.B': 14821,'A-1507-168.B': 26276,'M-1506-106.B': 9390,'M-1506-108.A': 8822,'M-1506-108.B': 10076,'M-1506-110.A': 32208,'M-1506-110.B': 31193,'M-1507-113.B': 72979,'M-1507-118.A': 5367,'M-1507-118.B': 4684,'M-1507-119.A': 66612,'M-1507-119.B': 13348,'M-1507-120.A': 33713,'M-1507-120.B': 8025,'M-1507-124.A': 16145,'M-1507-125.B': 28633,'M-1507-126.A': 18907,'M-1507-133.B': 4885,'M-1507-134.B': 42507,'M-1507-136.A': 17102,'M-1507-147.A': 5015,'M-1507-147.B': 114078,'M-1507-154.A': 16207,'M-1507-154.B': 12175,'M-1507-155.A': 9714,'M-1507-155.B': 14034,'S-1409-41.B': 4865,'S-1409-52.B': 2994,'S-1409-57.A': 3328,'S-1410-61.B': 12545,'S-1410-62.A': 12655,'S-1410-62.B': 3591,'S-1410-67.A': 3109,'S-1410-70.A': 14745,'S-1410-70.B': 16226,'S-1410-71.A': 3979,'S-1410-71.B': 2415,'S-1410-72.A': 25956,'S-1410-72.B': 19851,'S-1410-75.A': 5027,'S-1410-75.B': 1560,'S-1410-76.A': 28781,'S-1410-76.B': 11400,'S-1410-84.A': 15048,'S-1410-84.B': 5149,'S-1504-86.A': 15101},'BC1': {'1001.2': 289306,'1010.1': 161496,'1010.2': 69964,'1018.2': 47739,'1021.2': 124848,'1026.1': 68643,'1026.2': 17652,'1029.1': 35123,'1029.2': 131421,'1048.2': 178320,'1049.2': 97477,'1057.2': 72803,'1065.1': 66952,'1065.2': 116619,'1067.1': 70103,'1067.2': 60019,'1071.1': 355549,'1071.2': 253142,'1072.1': 72188,'1072.2': 181514,'1073.1': 132905,'1073.2': 123315,'1080.2': 105312,'1086.2': 26294,'2018.1': 63484,'2018.2': 341118,'2028.2': 65058,'2031.2': 140441,'2034.1': 84939,'2034.2': 49515,'2036.1': 145002,'2050.2': 103857,'3038.1': 13941,'3038.2': 79499,'3041.1': 42726,'3041.2': 124551,'3042.1': 40899,'3042.2': 40565,'A-1501-03.A': 137056,'A-1501-03.B': 166252,'A-1505-99.A': 202502,'A-1505-99.B': 61795,'A-1507-168.B': 144826,'M-1506-106.B': 92482,'M-1506-108.A': 134468,'M-1506-108.B': 167032,'M-1506-110.A': 101216,'M-1506-110.B': 100130,'M-1507-113.B': 156389,'M-1507-118.A': 178511,'M-1507-118.B': 114049,'M-1507-119.A': 127491,'M-1507-119.B': 96218,'M-1507-120.A': 227099,'M-1507-120.B': 97021,'M-1507-124.A': 63121,'M-1507-125.B': 126164,'M-1507-126.A': 62577,'M-1507-133.B': 33532,'M-1507-134.B': 104437,'M-1507-136.A': 25218,'M-1507-147.A': 180090,'M-1507-147.B': 67312,'M-1507-154.A': 78943,'M-1507-154.B': 73775,'M-1507-155.A': 111586,'M-1507-155.B': 146237,'S-1409-41.B': 134373,'S-1409-52.B': 122611,'S-1409-57.A': 139990,'S-1410-61.B': 326334,'S-1410-62.A': 360458,'S-1410-62.B': 448642,'S-1410-67.A': 250696,'S-1410-70.A': 72425,'S-1410-70.B': 192340,'S-1410-71.A': 113476,'S-1410-71.B': 160124,'S-1410-72.A': 82178,'S-1410-72.B': 118238,'S-1410-75.A': 70348,'S-1410-75.B': 277236,'S-1410-76.A': 130693,'S-1410-76.B': 256835,'S-1410-84.A': 103621,'S-1410-84.B': 56052,'S-1504-86.A': 108613},'BC10': {'1001.2': 33754,'1010.1': 16476,'1010.2': 8935,'1018.2': 1221,'1021.2': 80753,'1026.1': 716,'1026.2': 334,'1029.1': 1008,'1029.2': 1008,'1048.2': 8115,'1049.2': 27643,'1057.2': 6681,'1065.1': 1020,'1065.2': 1269,'1067.1': 5771,'1067.2': 1800,'1071.1': 4905,'1071.2': 6513,'1072.1': 12068,'1072.2': 22154,'1073.1': 889,'1073.2': 380,'1080.2': 5208,'1086.2': 1359,'2018.1': 1577,'2018.2': 5306,'2028.2': 2675,'2031.2': 1284,'2034.1': 2081,'2034.2': 1229,'2036.1': 2548,'2050.2': 4020,'3038.1': 334,'3038.2': 943,'3041.1': 429,'3041.2': 3665,'3042.1': 845,'3042.2': 1700,'A-1501-03.A': 2357,'A-1501-03.B': 2798,'A-1505-99.A': 3528,'A-1505-99.B': 1093,'A-1507-168.B': 13760,'M-1506-106.B': 2380,'M-1506-108.A': 8673,'M-1506-108.B': 7305,'M-1506-110.A': 12250,'M-1506-110.B': 9403,'M-1507-113.B': 56811,'M-1507-118.A': 9763,'M-1507-118.B': 3591,'M-1507-119.A': 15052,'M-1507-119.B': 2156,'M-1507-120.A': 13108,'M-1507-120.B': 3872,'M-1507-124.A': 5413,'M-1507-125.B': 15676,'M-1507-126.A': 5279,'M-1507-133.B': 5271,'M-1507-134.B': 1087,'M-1507-136.A': 3641,'M-1507-147.A': 4673,'M-1507-147.B': 1316,'M-1507-154.A': 6519,'M-1507-154.B': 3229,'M-1507-155.A': 5602,'M-1507-155.B': 10569,'S-1409-41.B': 2057,'S-1409-52.B': 1593,'S-1409-57.A': 13432,'S-1410-61.B': 7979,'S-1410-62.A': 5516,'S-1410-62.B': 1783,'S-1410-67.A': 6542,'S-1410-70.A': 4102,'S-1410-70.B': 6543,'S-1410-71.A': 22790,'S-1410-71.B': 12016,'S-1410-72.A': 11283,'S-1410-72.B': 1319,'S-1410-75.A': 1938,'S-1410-75.B': 2400,'S-1410-76.A': 2461,'S-1410-76.B': 10497,'S-1410-84.A': 5015,'S-1410-84.B': 1202,'S-1504-86.A': 57069},'BC100': {'1001.2': 3286,'1010.1': 10947,'1010.2': 7687,'1018.2': 2765,'1021.2': 38762,'1026.1': 33677,'1026.2': 13154,'1029.1': 5563,'1029.2': 9174,'1048.2': 13501,'1049.2': 23698,'1057.2': 3075,'1065.1': 18148,'1065.2': 24837,'1067.1': 8748,'1067.2': 11369,'1071.1': 4122,'1071.2': 41568,'1072.1': 67820,'1072.2': 42658,'1073.1': 12069,'1073.2': 38510,'1080.2': 25111,'1086.2': 3059,'2018.1': 11287,'2018.2': 46781,'2028.2': 12872,'2031.2': 43654,'2034.1': 12293,'2034.2': 4663,'2036.1': 7529,'2050.2': 26721,'3038.1': 5641,'3038.2': 27469,'3041.1': 18354,'3041.2': 24639,'3042.1': 14481,'3042.2': 19247,'A-1501-03.A': 39180,'A-1501-03.B': 58928,'A-1505-99.A': 16431,'A-1505-99.B': 17782,'A-1507-168.B': 26221,'M-1506-106.B': 2450,'M-1506-108.A': 35528,'M-1506-108.B': 45668,'M-1506-110.A': 47633,'M-1506-110.B': 76327,'M-1507-113.B': 16337,'M-1507-118.A': 2003,'M-1507-118.B': 80529,'M-1507-119.A': 33802,'M-1507-119.B': 59446,'M-1507-120.A': 29498,'M-1507-120.B': 24406,'M-1507-124.A': 2117,'M-1507-125.B': 42188,'M-1507-126.A': 12968,'M-1507-133.B': 15551,'M-1507-134.B': 72534,'M-1507-136.A': 5452,'M-1507-147.A': 311,'M-1507-147.B': 102750,'M-1507-154.A': 18811,'M-1507-154.B': 14461,'M-1507-155.A': 4477,'M-1507-155.B': 6166,'S-1409-41.B': 3421,'S-1409-52.B': 6475,'S-1409-57.A': 140259,'S-1410-61.B': 17793,'S-1410-62.A': 74388,'S-1410-62.B': 21366,'S-1410-67.A': 5405,'S-1410-70.A': 65814,'S-1410-70.B': 155655,'S-1410-71.A': 10657,'S-1410-71.B': 8941,'S-1410-72.A': 6123,'S-1410-72.B': 24783,'S-1410-75.A': 2620,'S-1410-75.B': 337,'S-1410-76.A': 45598,'S-1410-76.B': 5859,'S-1410-84.A': 9742,'S-1410-84.B': 20088,'S-1504-86.A': 5997},'BC101': {'1001.2': 12807,'1010.1': 16089,'1010.2': 28135,'1018.2': 7601,'1021.2': 29398,'1026.1': 8161,'1026.2': 2873,'1029.1': 3002,'1029.2': 23365,'1048.2': 24211,'1049.2': 12970,'1057.2': 18223,'1065.1': 5070,'1065.2': 15738,'1067.1': 11808,'1067.2': 18002,'1071.1': 10263,'1071.2': 20660,'1072.1': 30239,'1072.2': 23493,'1073.1': 9962,'1073.2': 9259,'1080.2': 57914,'1086.2': 10509,'2018.1': 8176,'2018.2': 13699,'2028.2': 23270,'2031.2': 11688,'2034.1': 7456,'2034.2': 4892,'2036.1': 5897,'2050.2': 24212,'3038.1': 822,'3038.2': 8498,'3041.1': 3023,'3041.2': 12399,'3042.1': 3497,'3042.2': 11858,'A-1501-03.A': 2538,'A-1501-03.B': 4517,'A-1505-99.A': 3186,'A-1505-99.B': 6374,'A-1507-168.B': 9800,'M-1506-106.B': 9571,'M-1506-108.A': 7972,'M-1506-108.B': 12036,'M-1506-110.A': 21647,'M-1506-110.B': 18908,'M-1507-113.B': 13387,'M-1507-118.A': 20837,'M-1507-118.B': 35744,'M-1507-119.A': 6812,'M-1507-119.B': 13414,'M-1507-120.A': 24473,'M-1507-120.B': 9791,'M-1507-124.A': 30794,'M-1507-125.B': 29891,'M-1507-126.A': 9887,'M-1507-133.B': 7909,'M-1507-134.B': 3400,'M-1507-136.A': 5674,'M-1507-147.A': 74549,'M-1507-147.B': 2853,'M-1507-154.A': 5432,'M-1507-154.B': 23947,'M-1507-155.A': 5888,'M-1507-155.B': 4172,'S-1409-41.B': 14725,'S-1409-52.B': 19069,'S-1409-57.A': 12003,'S-1410-61.B': 21601,'S-1410-62.A': 18475,'S-1410-62.B': 21780,'S-1410-67.A': 30727,'S-1410-70.A': 3549,'S-1410-70.B': 21779,'S-1410-71.A': 185412,'S-1410-71.B': 78044,'S-1410-72.A': 8771,'S-1410-72.B': 1100,'S-1410-75.A': 6739,'S-1410-75.B': 53418,'S-1410-76.A': 24381,'S-1410-76.B': 68226,'S-1410-84.A': 12141,'S-1410-84.B': 4067,'S-1504-86.A': 12996},'BC102': {'1001.2': 11219,'1010.1': 6212,'1010.2': 5608,'1018.2': 771,'1021.2': 4191,'1026.1': 1567,'1026.2': 378,'1029.1': 584,'1029.2': 534,'1048.2': 3344,'1049.2': 27804,'1057.2': 179,'1065.1': 2359,'1065.2': 6919,'1067.1': 2335,'1067.2': 301,'1071.1': 1975,'1071.2': 4508,'1072.1': 6226,'1072.2': 6786,'1073.1': 5397,'1073.2': 1984,'1080.2': 422,'1086.2': 261,'2018.1': 700,'2018.2': 298,'2028.2': 1575,'2031.2': 4126,'2034.1': 5626,'2034.2': 972,'2036.1': 773,'2050.2': 9878,'3038.1': 462,'3038.2': 1571,'3041.1': 5059,'3041.2': 3557,'3042.1': 35644,'3042.2': 9463,'A-1501-03.A': 997,'A-1501-03.B': 8698,'A-1505-99.A': 1430,'A-1505-99.B': 2856,'A-1507-168.B': 2674,'M-1506-106.B': 380,'M-1506-108.A': 6261,'M-1506-108.B': 4569,'M-1506-110.A': 3987,'M-1506-110.B': 2212,'M-1507-113.B': 391,'M-1507-118.A': 411,'M-1507-118.B': 2462,'M-1507-119.A': 2932,'M-1507-119.B': 5597,'M-1507-120.A': 8961,'M-1507-120.B': 4788,'M-1507-124.A': 2628,'M-1507-125.B': 2169,'M-1507-126.A': 3431,'M-1507-133.B': 4702,'M-1507-134.B': 667,'M-1507-136.A': 5041,'M-1507-147.A': 152,'M-1507-147.B': 819,'M-1507-154.A': 233,'M-1507-154.B': 8963,'M-1507-155.A': 2123,'M-1507-155.B': 1654,'S-1409-41.B': 1625,'S-1409-52.B': 2464,'S-1409-57.A': 3097,'S-1410-61.B': 4198,'S-1410-62.A': 4627,'S-1410-62.B': 652,'S-1410-67.A': 682,'S-1410-70.A': 1507,'S-1410-70.B': 2692,'S-1410-71.A': 8955,'S-1410-71.B': 3057,'S-1410-72.A': 5078,'S-1410-72.B': 4436,'S-1410-75.A': 2217,'S-1410-75.B': 76,'S-1410-76.A': 2578,'S-1410-76.B': 1591,'S-1410-84.A': 430,'S-1410-84.B': 3293,'S-1504-86.A': 1022},'BC103': {'1001.2': 47,'1010.1': 4121,'1010.2': 2117,'1018.2': 2568,'1021.2': 25001,'1026.1': 2212,'1026.2': 1535,'1029.1': 4580,'1029.2': 1152,'1048.2': 8221,'1049.2': 27980,'1057.2': 1380,'1065.1': 11013,'1065.2': 23179,'1067.1': 3541,'1067.2': 2241,'1071.1': 9779,'1071.2': 15474,'1072.1': 8528,'1072.2': 10340,'1073.1': 5147,'1073.2': 14658,'1080.2': 2112,'1086.2': 406,'2018.1': 5170,'2018.2': 30349,'2028.2': 6192,'2031.2': 5190,'2034.1': 12565,'2034.2': 2884,'2036.1': 6942,'2050.2': 17112,'3038.1': 540,'3038.2': 11259,'3041.1': 4713,'3041.2': 14039,'3042.1': 31265,'3042.2': 23319,'A-1501-03.A': 6818,'A-1501-03.B': 14055,'A-1505-99.A': 8326,'A-1505-99.B': 9245,'A-1507-168.B': 6074,'M-1506-106.B': 2501,'M-1506-108.A': 19348,'M-1506-108.B': 40895,'M-1506-110.A': 26179,'M-1506-110.B': 10612,'M-1507-113.B': 7493,'M-1507-118.A': 2033,'M-1507-118.B': 17832,'M-1507-119.A': 69373,'M-1507-119.B': 10119,'M-1507-120.A': 10813,'M-1507-120.B': 1515,'M-1507-124.A': 5464,'M-1507-125.B': 3609,'M-1507-126.A': 1456,'M-1507-133.B': 6704,'M-1507-134.B': 22506,'M-1507-136.A': 2103,'M-1507-147.A': 2314,'M-1507-147.B': 40975,'M-1507-154.A': 10102,'M-1507-154.B': 9181,'M-1507-155.A': 8766,'M-1507-155.B': 3702,'S-1409-41.B': 2009,'S-1409-52.B': 4647,'S-1409-57.A': 12433,'S-1410-61.B': 10995,'S-1410-62.A': 24021,'S-1410-62.B': 15828,'S-1410-67.A': 1468,'S-1410-70.A': 28608,'S-1410-70.B': 24070,'S-1410-71.A': 9840,'S-1410-71.B': 1263,'S-1410-72.A': 10484,'S-1410-72.B': 13375,'S-1410-75.A': 3502,'S-1410-75.B': 207,'S-1410-76.A': 14776,'S-1410-76.B': 659,'S-1410-84.A': 9886,'S-1410-84.B': 8042,'S-1504-86.A': 14472},'BC104': {'1001.2': 0,'1010.1': 35,'1010.2': 313,'1018.2': 35,'1021.2': 9,'1026.1': 288,'1026.2': 1,'1029.1': 0,'1029.2': 0,'1048.2': 12,'1049.2': 415,'1057.2': 37,'1065.1': 162,'1065.2': 241,'1067.1': 47,'1067.2': 22,'1071.1': 6,'1071.2': 0,'1072.1': 1,'1072.2': 7,'1073.1': 1,'1073.2': 0,'1080.2': 0,'1086.2': 0,'2018.1': 10,'2018.2': 129,'2028.2': 127,'2031.2': 57,'2034.1': 12,'2034.2': 0,'2036.1': 64,'2050.2': 64,'3038.1': 0,'3038.2': 449,'3041.1': 0,'3041.2': 20,'3042.1': 3,'3042.2': 7620,'A-1501-03.A': 21,'A-1501-03.B': 49,'A-1505-99.A': 17,'A-1505-99.B': 0,'A-1507-168.B': 0,'M-1506-106.B': 0,'M-1506-108.A': 767,'M-1506-108.B': 407,'M-1506-110.A': 1,'M-1506-110.B': 3,'M-1507-113.B': 2069,'M-1507-118.A': 2,'M-1507-118.B': 110,'M-1507-119.A': 3081,'M-1507-119.B': 1222,'M-1507-120.A': 1340,'M-1507-120.B': 151,'M-1507-124.A': 0,'M-1507-125.B': 1,'M-1507-126.A': 0,'M-1507-133.B': 1012,'M-1507-134.B': 8,'M-1507-136.A': 8,'M-1507-147.A': 385,'M-1507-147.B': 4,'M-1507-154.A': 205,'M-1507-154.B': 24,'M-1507-155.A': 0,'M-1507-155.B': 349,'S-1409-41.B': 3,'S-1409-52.B': 640,'S-1409-57.A': 3,'S-1410-61.B': 3,'S-1410-62.A': 226,'S-1410-62.B': 12,'S-1410-67.A': 33,'S-1410-70.A': 0,'S-1410-70.B': 2965,'S-1410-71.A': 0,'S-1410-71.B': 0,'S-1410-72.A': 4,'S-1410-72.B': 54,'S-1410-75.A': 218,'S-1410-75.B': 170,'S-1410-76.A': 99,'S-1410-76.B': 481,'S-1410-84.A': 0,'S-1410-84.B': 9,'S-1504-86.A': 0},'BC105': {'1001.2': 0,'1010.1': 3813,'1010.2': 5828,'1018.2': 232,'1021.2': 412,'1026.1': 4,'1026.2': 13,'1029.1': 95,'1029.2': 8,'1048.2': 2127,'1049.2': 9956,'1057.2': 18,'1065.1': 469,'1065.2': 2961,'1067.1': 988,'1067.2': 439,'1071.1': 14668,'1071.2': 3951,'1072.1': 415,'1072.2': 182,'1073.1': 1288,'1073.2': 74,'1080.2': 122,'1086.2': 696,'2018.1': 21,'2018.2': 173,'2028.2': 3865,'2031.2': 59,'2034.1': 1097,'2034.2': 255,'2036.1': 1710,'2050.2': 8870,'3038.1': 307,'3038.2': 445,'3041.1': 984,'3041.2': 5100,'3042.1': 1481,'3042.2': 139,'A-1501-03.A': 351,'A-1501-03.B': 1183,'A-1505-99.A': 11933,'A-1505-99.B': 4359,'A-1507-168.B': 8246,'M-1506-106.B': 980,'M-1506-108.A': 699,'M-1506-108.B': 4191,'M-1506-110.A': 3477,'M-1506-110.B': 36780,'M-1507-113.B': 8960,'M-1507-118.A': 543,'M-1507-118.B': 324,'M-1507-119.A': 7886,'M-1507-119.B': 1448,'M-1507-120.A': 15303,'M-1507-120.B': 1669,'M-1507-124.A': 9443,'M-1507-125.B': 3264,'M-1507-126.A': 430,'M-1507-133.B': 176,'M-1507-134.B': 952,'M-1507-136.A': 163,'M-1507-147.A': 310,'M-1507-147.B': 16023,'M-1507-154.A': 1068,'M-1507-154.B': 2703,'M-1507-155.A': 71589,'M-1507-155.B': 351,'S-1409-41.B': 956,'S-1409-52.B': 85,'S-1409-57.A': 168,'S-1410-61.B': 1492,'S-1410-62.A': 1215,'S-1410-62.B': 562,'S-1410-67.A': 218,'S-1410-70.A': 925,'S-1410-70.B': 643,'S-1410-71.A': 87,'S-1410-71.B': 428,'S-1410-72.A': 232,'S-1410-72.B': 973,'S-1410-75.A': 11737,'S-1410-75.B': 21,'S-1410-76.A': 1169,'S-1410-76.B': 1833,'S-1410-84.A': 108,'S-1410-84.B': 6469,'S-1504-86.A': 13818}}
X = pd.DataFrame(data) + 1
# Shape of X where rows are samples and columns are features
n,m = X.shape
index_samples = X.index
index_features = X.columns
X_values = X.values
# A = np.empty((n, m**2 - m))
# A[:] = np.nan
# Not the most efficient way but the best way to show what I'm trying to do
A = defaultdict(dict)
for row_pos, a in enumerate(X_values):
id_sample = index_samples[row_pos]
# col_pos = 0
for i in range(m):
a_i = a[i]
i_feature = index_features[i]
for j in range( m):
if i != j:
a_j = a[j]
j_feature = index_features[j]
# A[row_pos, col_pos] = a_i - a_j
A[id_sample]["{}/{}".format(i_feature, j_feature)] = np.log(a_i/a_j)
# col_pos += 1
df = pd.DataFrame(A).T
df.iloc[:5,:5]
BC0a/BC0b BC0a/BC1 BC0a/BC10 BC0a/BC100 BC0a/BC101
1001.2 -0.364454 -4.250907 -2.102548 0.226606 -1.133489
1010.1 -1.621745 -3.172429 -0.889908 -0.481099 -0.866140
1010.2 0.381012 -1.785419 0.272488 0.422915 -0.874474
1018.2 -0.263715 -2.106878 1.558403 0.741490 -0.269520
1021.2 -0.975581 -2.575287 -2.139590 -1.405648 -1.129143
您可以使用np.triu_indices
通过索引得到所有可能的组合:
i_index, j_index = np.triu_indices(m, 1)
利用对数的发明可以做到 log(a / b) = log(a) - log(b)
,您现在可以做到:
df = pd.DataFrame(data=np.log(X_values[:, i_index]) - np.log(X_values[:, j_index]),
index=X.index.copy(), columns=[f'{a}/{b}' for a, b in zip(X.columns[i_index], X.columns[j_index])])
虽然在我看来它更优雅,但您可以轻松地保持比率的原始公式:
np.log(X_values[:, i_index] / X_values[:, j_index])
请注意,这是您的答案包含的一半数据。另一半只是反比,在对数 table 中显示为负数。如果你绝对坚持计算这些(即使它很浪费),你可以相应地调整 i_index
和 j_index
:
i_index = np.repeat(np.arange(m), m - 1)
j_index = np.delete(np.tile(np.arange(m), m), slice(None, None, m + 1))
无论哪种方式,您的整个代码都可以用大约三行来表达。