2D numpy数组的映射函数

per*_*iae 6 python numpy

我有一个函数foo,它将NxM numpy数组作为参数并返回标量值.我有一个AxNxM numpy数组data,我想在其上映射foo给我一个长度为A的numpy数组.

当然,我这样做:

result = numpy.array([foo(x) for x in data])
Run Code Online (Sandbox Code Playgroud)

它有效,但似乎我没有利用numpy魔法(和速度).有没有更好的办法?

我看过了numpy.vectorize,numpy.apply_along_axis但是,它们都不适用于2D数组的功能.

编辑:我正在对24x24图像补丁进行增强回归,因此我的AxNxM类似于1000x24x24.我foo上面所说的将一个类似Haar的特性应用于补丁(因此,计算密集程度不是很大).

wis*_*sty 2

如果 NxM 很大(比如 100),那么迭代 A 的成本将被摊销到基本上为零。

假设数组为 1000 X 100 X 100。

迭代时间为 O(1000),但内部函数的累积成本为 O(1000 X 100 X 100) - 慢 10,000 倍。(注意,我的术语有点奇怪,但我确实知道我在说什么)

我不确定,但你可以试试这个:

result = numpy.empty(data.shape[0])
for i in range(len(data)):
    result[i] = foo(data[i])
Run Code Online (Sandbox Code Playgroud)

您可以在构建列表时节省大量内存分配...但循环开销会更大。

或者您可以编写循环的并行版本,并将其拆分到多个进程中。这可能会快得多,具体取决于密集程度foo(因为它必须抵消数据处理)。

  • 变体:`结果 = np.fromiter(itertools.imap(f, data), dtype=data.dtype, count=data.shape[0])` (5认同)