Numpy意思是“原地踏步”

2024-05-31 23:42:37 发布

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

我有一行代码是这样的:

te_succ_rate = np.mean(np.argmax(test_y, axis=1) == self.predictor(test_x))

其中test_y是数组的numpy数组,self.predictor(test_x)返回numpy数组。整行代码返回test_y中子数组的百分比,其最大值等于从self.predictor(test_x)返回的数组中相应位置的值。在

问题是,对于较大的test_ytest_x,它会耗尽内存。1万可以用,但6万不行。在

有没有办法避免这种情况?在

我试过了:

^{pr2}$

但是它不起作用,因为结果是0(这是不正确的)。在


Tags: 代码testselfnumpyratenp数组mean
1条回答
网友
1楼 · 发布于 2024-05-31 23:42:37

1级:

虽然这不是内联操作的答案,但它仍然可以解决您的问题:

你确定你从mean而不是argmax耗尽内存?在

test_y中的每个额外维度都将存储一个额外的N个数据类型。假设数据中有5个维度,那么必须存储5N个值(大概是浮点值)。你的self.predictor(test_x)的结果将占用6/N的内存。作为条件答案的临时数组是第7个N。我实际上不知道np.mean的内存使用量是多少,但我假设它不是另一个N。但是为了参数的缘故,我们假设它是。如果只内联np.mean,那么最多只能节省N个内存,而您已经需要7N个内存。在

因此,或者,尝试在上一步中将np.argmax(test_y, axis=1)拉到一个中间变量中,并且在计算argmax之后不要再次引用test_y,这样test_y会被垃圾回收。(或者执行python3所做的任何操作来强制删除该变量)这样可以节省数据的维数减去1n的内存使用量。(您的内存使用量将下降到大约3N或4N,这比仅仅使用np.mean来实现要好。在

我假设运行self.predictor(test_x)只需要1N,如果需要更多的时间,那么以同样的方式将其拖入自己的中间变量也会有所帮助。在

二级:

如果这还不够,仍然将您的np.argmax(test_y, axis=1)和{}拖入它们自己的变量中,然后自己遍历这两个数组,自己进行条件和聚合。比如:

sum = 0.
n = 0
correct_ans = np.argmax(test_y, axis=1)
returned_ans = self.predictor(test_x)
for c, r in zip(correct_ans, returned_ans):
    if c == r:
        sum += 1
    n += 1
avg = sum / n

(不确定zip是否是最好的方法。np可能有更有效的方法来做同样的事情。这是您尝试的第二种方法,但是在不存储额外数组的情况下累积聚合) 这样,您还可以节省存储由条件生成的布尔值的临时列表的需要。在

如果这还不够,你将不得不从根本上改变你存储实际结果和目标结果的方式,因为问题是你无法将目标和结果放入内存。在

相关问题 更多 >