gpt4 book ai didi

python - 建立没有循环的矩阵?

转载 作者:太空宇宙 更新时间:2023-11-03 15:19:47 25 4
gpt4 key购买 nike

我试图避免在以下代码中使用循环,因为它很慢。我从一个标签列表和一个指标列表开始,长度相同,均为几百万。然后我想要制作一个对称的 NxN 矩阵,其中 N 是唯一标签值的数量(大约 100)。该矩阵包含度量的比较。具体来说,指标是列表的列表,我想计算子列表中匹配元素的数量,并用该值更新输出矩阵。当前代码是:

matrix = {}
for i,value_i in enumerate(labels):
for j,value_j in enumerate(labels):
if i >= j:
matrix[(value_i,value_j)] = matrix.get((value_i,value_j), 0)
+ np.count_nonzero(metrics[i]==metrics[j])
if i != j:
matrix[(value_j,value_i)] = matrix[(value_i,value_j)]

我想做一些类似列表理解的事情,但也想要一本字典,因为我经常更新。对于上下文,我已将其从更详细的代码 here 中删除。

--------更新--------

奖励对@piRSquared建议使用numba的回答。 yield 来自于使用这个包而不是使用数组而不是字典。作为比较,以下速度慢了 1.29 倍。

f, u = pd.factorize(labels)
mx = f.max() + 1
matrix = np.zeros((mx, mx), np.int64)
for i in f:
for j in f:
if i >= j:
matrix[i, j] = matrix[i, j]
+ np.count_nonzero(metrics[i] == metrics[j])
if i != j:
matrix[j, i] = matrix[i, j]
df = pd.DataFrame(matrix, u, u)

最佳答案

我还在搞乱这个。这仍然是一个循环,但我使用 numba 来加速它。我最终将用更多信息充实这篇文章。不过,我现在想给你一些可以使用的东西。

我还有其他加快速度的想法。

from string import ascii_uppercase
import numpy as np
import pandas as pd
from numba import njit

@njit
def fill(f, metrics):
mx = f.max() + 1
matrix = np.zeros((mx, mx), np.int64)
for i in f:
for j in f:
if i >= j:
row_i = metrics[i]
row_j = metrics[j]
matrix[i, j] = matrix[i, j] + (row_i == row_j).sum()
if i != j:
matrix[j, i] = matrix[i, j]
return matrix


def fill_from_labels(labels, metrics):
f, u = pd.factorize(labels)
matrix = fill(f, metrics)
return pd.DataFrame(matrix, u, u)

df = fill_from_labels(labels, metrics)

关于python - 建立没有循环的矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43621977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com