变量值的变化取决于它是第一次执行还是第二次执行

2024-09-26 22:44:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个非常具体的问题,我甚至无法寻找类似的问题

我有以下变量

cm = np.array([[65, 4, 22, 24],
               [6, 81, 5, 8],
               [0, 11, 85, 19],
               [4, 7, 3, 90]])

proportions = [0.3, 0.4, 0.1, 0.2]

n = np.sum(cm)
nisum = np.sum(cm, axis=1)
nsumj = np.sum(cm, axis=0)

p_i = np.zeros([cm.shape[0], 1])
p_ii = np.zeros([cm.shape[0], cm.shape[1]])
prod_ac = np.zeros([cm.shape[0], 1])
user_ac = np.zeros([cm.shape[0], 1])
overall_ac = 0

for i in range(cm.shape[1]):
    for j in range(cm.shape[0]):
        p_ii[i, j] = proportions[i] * cm[i, j] / nisum[i]

    if i == 0:
        p_i = np.sum(p_ii, axis=0)

    prod_ac[i] = ((proportions[i] / p_i[i]) * (cm[i, i] / nisum[i]))
    user_ac[i] = cm[i, i] / nisum[i]
    overall_ac += proportions[i] * cm[i, i] / nisum[i]

如果我在PyCharm的控制台中执行整个代码块,prod\u ac的结果是错误的,结果是

prod_ac
Out[215]: 
array([[  1.        ],
   [ 31.05      ],
   [  1.28787879],
   [  2.76442308]])

但是,如果我立即再次执行代码的循环部分,prod\u ac的结果就可以了:

prod_ac
Out[217]: 
array([[ 0.84252858],
   [ 0.90639122],
   [ 0.47056319],
   [ 0.60898115]])

不会出现错误或警告

我猜这是和记忆有关。如果我一次执行所有的行,结果是错误的。但是如果我执行第一部分(从第1行到循环之前的那行),然后执行循环,结果就可以了

所有其他变量每次都创建得很好。这只是麻烦事

有人知道问题出在哪里吗??我怎么能每次都取得好成绩。这将是一个函数的一部分,所以我将无法执行部分在未来

谢谢


Tags: 错误npzeroscmprodarrayacii
1条回答
网友
1楼 · 发布于 2024-09-26 22:44:49

这不是内存问题。问题出在p_i

import numpy as np
cm = np.array([[65, 4, 22, 24],
               [6, 81, 5, 8],
               [0, 11, 85, 19],
               [4, 7, 3, 90]])

proportions = [0.3, 0.4, 0.1, 0.2]

n = np.sum(cm)
nisum = np.sum(cm, axis=1)
nsumj = np.sum(cm, axis=0)

p_i = np.zeros([cm.shape[0], 1])
p_ii = np.zeros([cm.shape[0], cm.shape[1]])
prod_ac = np.zeros([cm.shape[0], 1])
user_ac = np.zeros([cm.shape[0], 1])
overall_ac = 0

for i in range(cm.shape[1]):
    for j in range(cm.shape[0]):
        p_ii[i, j] = proportions[i] * cm[i, j] / nisum[i]

    if i == 0:
        p_i = np.sum(p_ii, axis=0)
        print(p_i)

    prod_ac[i] = ((proportions[i] / p_i[i]) * (cm[i, i] / nisum[i]))
    user_ac[i] = cm[i, i] / nisum[i]
    overall_ac += proportions[i] * cm[i, i] / nisum[i]

for i in range(cm.shape[1]):
    for j in range(cm.shape[0]):
        p_ii[i, j] = proportions[i] * cm[i, j] / nisum[i]

    if i == cm.shape[1]-1:
        p_i = np.sum(p_ii, axis=0)
        print(p_i)

    prod_ac[i] = ((proportions[i] / p_i[i]) * (cm[i, i] / nisum[i]))
    user_ac[i] = cm[i, i] / nisum[i]
    overall_ac += proportions[i] * cm[i, i] / nisum[i]

会给

[0.16956522 0.01043478 0.0573913  0.0626087 ]
[0.20125753 0.35746154 0.15707358 0.28420736]

所以这就是造成差异的原因。原因是,在第i个轴完成之前,要求第i个轴的和。所以第二次工作是有意义的,因为这一次整个数组已经准备好了,所以它可以使用在接下来的迭代中生成的值。如何解决这个问题取决于你。一个工作示例如下:

for i in range(cm.shape[1]):
    for j in range(cm.shape[0]):
        p_ii[i, j] = proportions[i] * cm[i, j] / nisum[i]

p_i = np.sum(p_ii, axis=0)

for i in range(cm.shape[1]):
  prod_ac[i] = ((proportions[i] / p_i[i]) * (cm[i, i] / nisum[i]))
  user_ac[i] = cm[i, i] / nisum[i]
  overall_ac += proportions[i] * cm[i, i] / nisum[i]

相关问题 更多 >

    热门问题