有没有类似于numpy.map的函数?

4
我可能忽略了一些显而易见的东西,但我缺少一个名为numpy.map的函数。它与Python的map函数相同,但将输出收集到numpy数组中。例如,我可以有一个图像生成器genImage(i),它基于单个输入生成2D图像(大小为(m, n)),我想要将range(k)输入我的生成器函数,并获得一个(k, m, n)数组。
目前,我会使用numpy.array(list(map(genImage, range(k))),但我觉得这种转换成列表相当低效(我的最终数组约有50 GB大小)。因此,我正在寻找numpy.map(genImage, range(k)),它类似于numpy.fromiter,但用于迭代器的多维输出。
(我已经尝试过np.array(map(...)),但它返回一个具有该映射作为唯一条目的一元数组 - 原因在于:为什么需要将一个映射类型转换为列表才能将其分配给pandas系列?)。
是否有更好的方法来实现我想要的结果?我正在寻找一种理想的方式,可以与joblib一起使用。

1
np.frompyfunc可以做到这一点。输出是一个对象dtype数组。在我的过去的时间测试中,它可以比等效的np.array([list comprehension])快2倍。 - hpaulj
np,array(list(map(func...,))) 中,list 只是运行 map,将值收集到列表中。array 然后将这些值连接成一个数组。主要的时间消耗是多次调用函数,而不是收集机制。这个话题经常出现,通常被描述为向量化或避免循环。 - hpaulj
@hpaulj,您是在说将50 GB的内存从数组列表复制到一个复合数组中不是我应该担心的运行时显着来源吗? - bers
@hpaulj “一个接一个”听起来像是你建议我使用循环。我觉得这在性能方面不是最理想的选择-可以参考 https://dev59.com/oHI95IYBdhLWcg3w5SOh/ - bers
我建议使用类似于unutbu的numpy_all_the_way,它比array(list...)替代方案稍微快一些。他使用的是Py2,因此不需要在map中包装list - hpaulj
显示剩余2条评论
1个回答

1

如果我理解正确,您需要一个类似于column_stack的内容,它的工作方式如下:

import numpy as np

a = np.array([[1, 2], [3, 4], [5, 6]])

a = np.column_stack((range(3), a))

a
[[0 1 2]
 [1 3 4]
 [2 5 6]]

column_stack 只是将列表中的数组连接在一起的一种方式。看一下它的代码就明白了。 - hpaulj
但是看看它的代码。它在输入上执行列表推导,为每个添加一个维度,然后使用concatenate。这是一个不错的函数,但无法避免list(map..)步骤。 - hpaulj
@hpaulj 你是指 asanyarray() 步骤吗?是的,看来你是对的! - bers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接