gpt4 book ai didi

numpy - 使用矢量化将函数应用于 Numpy 二维数组中的每一行

转载 作者:行者123 更新时间:2023-12-03 23:23:16 25 4
gpt4 key购买 nike

我有一个 1000x784 的数据矩阵(10000 个示例和 784 个特征),称为 X_valid我想将以下函数应用于此矩阵中的每一行并获得数值结果:

def predict_prob(x_valid, cov, mean, prior):
return -0.5 * (x_valid.T.dot(np.linalg.inv(cov)).dot(x_valid) + mean.T.dot(
np.linalg.inv(cov)).dot(mean) + np.linalg.slogdet(cov)[1]) + np.log(
prior)

( x_valid 只是一行数据)。我正在使用 numpy 的 vectorize使用以下代码执行此操作:
v_predict_prob = np.vectorize(predict_prob)
scores = v_predict_prob(X_valid, covariance[num], means[num], priors[num])

( covariance[num]means[num]priors[num] 只是常量。)

但是,运行此程序时出现以下错误:
File "problem_5.py", line 48, in predict_prob
return -0.5 * (x_valid.T.dot(np.linalg.inv(cov)).dot(x_valid) + mean.T.dot(np.linalg.inv(cov)).dot(mean) + np.linalg.slogdet(cov)[1]) + np.log(prior)
AttributeError: 'numpy.float64' object has no attribute 'dot'

也就是说,它不会单独传入矩阵的每一行。相反,它传入矩阵的每个条目(不是我想要的)。

我怎样才能改变它以获得所需的行为?

最佳答案

vectorize不是迭代的一般替代品,也没有声称更快。它主要是简化对 numpy 的访问广播功能。通常,您向量化的函数将采用标量输入,而不是行或一维数组。

我认为没有配置 vectorize 的方法将数组传递给您的函数而不是项目。

您描述 x_valid作为要逐行评估的 2d。以及其他术语作为“常量”,您可以使用 [num] 选择它们.这些常数是什么形状?

您的函数将许多这些术语视为二维数组:

x_valid.T.dot(np.linalg.inv(cov)).dot(x_valid) + 
mean.T.dot(np.linalg.inv(cov)).dot(mean) +
np.linalg.slogdet(cov)[1]) + np.log(prior)
x_valid.T仅当 x_valid 才有意义是 2d。如果是 1d,则转置不记。
np.linalg.inv(cov)只有在 cov 时才有意义是 2d。
mean.T.dot...假设 mean是 2d。
np.linalg.slogdet(cov)[1]假设 np.linalg.slogdet(cov)有 2 个或更多元素(或行)。

在跳入迭代或“向量化”之前,您需要向我们展示该函数适用于一些真实数组。

关于numpy - 使用矢量化将函数应用于 Numpy 二维数组中的每一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35834657/

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