我有一行代码是这样的:
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_y
和test_x
,它会耗尽内存。1万可以用,但6万不行。在
有没有办法避免这种情况?在
我试过了:
^{pr2}$但是它不起作用,因为结果是0(这是不正确的)。在
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)
和{(不确定
zip
是否是最好的方法。np
可能有更有效的方法来做同样的事情。这是您尝试的第二种方法,但是在不存储额外数组的情况下累积聚合) 这样,您还可以节省存储由条件生成的布尔值的临时列表的需要。在如果这还不够,你将不得不从根本上改变你存储实际结果和目标结果的方式,因为问题是你无法将目标和结果放入内存。在
相关问题 更多 >
编程相关推荐