给定一些行的分类数据,我想用这些行之间的差异数来计算成对矩阵。在
例如,将值为[1, 0, 0, 1]
的行与值为[0, 0, 1, 1]
的行进行比较,得到的结果值是2,因为索引0和索引2不同。在
我想做一个矩阵,显示每一对组合行。我为此编写了代码,但是在处理大数据时效率很低。我知道一定有一种方法可以更有效地实现这一点,因为只需要计算矩阵的上半部分。在
不过,我不知道如何将其转换为代码。以下是我目前所掌握的情况:
shortened = pd.DataFrame(
[{'c1':1, 'c2':0, 'c3':0}, {'c1':1,'c2':1, 'c3':0}, {'c1':0,'c2':0, 'c3':1}]
)
distm = [[""]+ list(shortened.index)]
found = {}
for index,row in shortened.iterrows():
newrow = [index]
for i2,r2 in shortened.iterrows():
if((i2,index) in found):
newrow.append(found[(i2,index)])
continue
if(index == i2):
newrow.append(0)
continue
summeddif = sum(i != j for i, j in zip(row, r2))
newrow.append(summeddif)
found[(index,i2)] = summeddif
distm.append(newrow)
因此,通过这里的数据帧示例,可以获得正确的输出:
^{pr2}$然而,由于输入量很大,这需要花费很长时间。有没有一种优雅的方法只迭代上半部分,然后简单地复制到下半部分,这样我就不需要进行不必要的比较了?或者没有其他方法可以通过熊猫来改善这种状况吗?在
使用广播的异或。
异或是检查两个位是否相同的最简单(也是最快)的方法。只要您的输入是二进制的,这应该可以工作。
请注意,这是内存密集型的,特别是对于非常大的帧,有可能在大约1M行处出现OOM。
相关问题 更多 >
编程相关推荐