我可以做些什么来加快numpy中的蒙版数组吗?我有一个非常低效的函数,我改写为使用掩码数组(在这里我可以只掩码行而不是像以前那样进行复制和删除行)。但是,我震惊地发现被屏蔽的功能要慢10倍,因为被屏蔽的阵列要慢得多。

例如,采取以下措施(对我而言,被 mask 的速度要慢6倍以上):

import timeit
import numpy as np
import numpy.ma as ma

def test(row):
   return row[0] + row[1]

a = np.arange(1000).reshape(500, 2)
t = timeit.Timer('np.apply_along_axis(test, 1, a)','from __main__ import test, a, np')
print round(t.timeit(100), 6)

b = ma.array(a)
t = timeit.Timer('ma.apply_along_axis(test, 1, b)','from __main__ import test, b, ma')
print round(t.timeit(100), 6)

最佳答案

我不知道为什么掩码数组函数移动这么慢,但是由于听起来好像您正在使用掩码选择行(而不是单个值),因此可以从掩码行创建常规数组并使用np函数反而:

b.mask = np.zeros(500)
b.mask[498] = True
t = timeit.Timer('c=b.view(np.ndarray)[~b.mask[:,0]]; np.apply_along_axis(test, 1, c)','from __main__ import test, b, ma, np')
print round(t.timeit(100), 6)

更好的是,根本不使用掩码数组。只需将数据和一维掩码数组作为单独的变量进行维护:
a = np.arange(1000).reshape(500, 2)
mask = np.ones(a.shape[0], dtype=bool)
mask[498] = False
out = np.apply_along_axis(test, 1, a[mask])

关于python - Python/Numpy-掩码数组非常慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5760668/

10-13 05:27