我有一个函数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的特性应用于补丁(因此,计算密集程度不是很大).
如果 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
(因为它必须抵消数据处理)。
归档时间: |
|
查看次数: |
10370 次 |
最近记录: |