2017-11-18 343 views
1

从这个线程我们可以看到,如何将列表理解中的多个返回值解压缩到一个元组。python列表理解为numpy数组的多重返回函数

def f(x): 
    return 2*x, x*x 

x = range(1, 4) 
xlist, ylist = zip(*[f(value) for value in x]) 

有没有办法直接做一个numpy数组?或者是唯一的解决方案:

xlist = np.asarray(xlist) 

回答

1

您可以使用:

xlist,ylist = np.fromiter(
     itertools.chain.from_iterable(f(value) for value in x), 
     dtype=np.int_, 
     count=len(x)*2 
    ).reshape((-1,2)).T 

xlist,ylist = np.array([f(value) for value in x]).T 

但是,正如其他答案所提出的那样,直接在数组上工作的方法可能更具可读性,而且速度更快。

+0

为什么第一个解决方案几乎快两倍? – Peterhack

+0

@Peterhack可以肯定,你的意思是比我提出的其他解决方案更快吗?它可能是因为它不创建中间列表,输出数组是使用'count'参数预先分配的,并使用来自生成器的值直接填充(清楚地说明:第一个解决方案中不包含列表理解,但是一个生成器表达式)。 – lukas

2

要做到这一点与numpy.array,只需传递参数作为数组本身。在功能上的操作被映射在数组参数和返回两个数组的一个元组:

>>> xlist, ylist = f(np.asarray(x)) 
>>> xlist 
array([2, 4, 6]) 
>>> ylist 
array([1, 4, 9]) 
+0

我意识到这一点,但这不仅仅是一个基本的例子。这就是为什么我仍然对这样的解决方案感兴趣。例如。如果我想将最后的结果作为下一次迭代的输入,会发生什么情况。像:'进口numpy的作为NP X = np.arange(10,14) Y = [] t = 0时为 J,I中枚举(X): 吨+ = I y.append(t)的' – Peterhack

+0

@Peterhack,然后你问错了问题。 –

+0

这就是为什么我没有要求。我只想看看它是如何工作的,而不管函数是否可以处理数组。对不起,没有说清楚。 – Peterhack

1

无需zip或列表内涵。你也不需要改变你的f功能:

>>> import numpy as np 
>>> x = np.arange(1, 4) 
>>> array1, array2 = f(x) 
>>> array1 
array([2, 4, 6]) 
>>> array2 
array([1, 4, 9]) 

如果x是一个数组,2 * x意味着x每个元素将2相乘:

>>> 2 * x 
array([2, 4, 6]) 
+0

假设在无法处理数组的函数之间存在某种东西,列表理解将成为获得的方式,对吗?这就是为什么我非常热切地寻找这个原因。 – Peterhack