结合 zip 多次产生 python 参考
Yield a python reference multiple times in combination with zip
我在 numpy 中有一个相当大的数组,并且想将值生成给管道中的下一个处理函数。我已经预先分配了 numpy 数组,因为我不想每次都分配内存。
在一个函数中我必须产生两个值,第一个应该在之后直接使用,第二个在几个管道阶段之后。
代码的简化版本如下所示:
import numpy as np
def numbers():
ret = np.array([0])
for i in range(4):
ret[0] = i
yield ret
def raw(gen):
for d in gen:
yield d
def add_ten(gen):
for d in gen:
yield d, d+10
def fun1():
nums = numbers()
g1, g2 = zip(*add_ten(nums))
for n1, n2 in zip(g1, g2):
print(n1, n2)
def fun2():
nums = numbers()
g = raw(nums)
for n in g:
print(n)
print("fun1")
fun1()
print("fun2")
fun2()
代码returns以下
fun1
[3] [10]
[3] [11]
[3] [12]
[3] [13]
fun2
[0]
[1]
[2]
[3]
生成器总是生成相同的引用,我只是更改了基础数据。很明显,如果我将数据收集到列表中,我会看到始终相同的值,因为只存储了引用。
但是,我不明白为什么 fun1
中的 g1
不起作用,而 fun2
中的 g
却按预期工作。
编辑:
我很感激这个问题的解决方法。
编辑:
在我的应用程序中,我再次将这些迭代器传递给函数,并在几步之后加入它们。
Thierry 已经有了解决方案,如果我直接使用这些值,谢谢你:)
def fun3():
nums = numbers()
g1, g2 = zip(*add_ten(nums))
h1 = raw(g1)
h2 = raw(g2)
for n1, n2 in zip(h1, h2):
print(n1, n2)
这是因为 *add_ten(nums)
发生在 g1, g2 = zip(*add_ten(nums))
中。
为了创建解压列表,add_tens
生成器立即耗尽。此列表将作为 zip
的参数,将包含:
(<your array>, <a new array containing 10>),
(<your array>, <a new array containing 11>),
(<your array>, <a new array containing 12>),
(<your array>, <a new array containing 13>),
由 add_ten
生成。
压缩后,您将拥有:
(<your array>, <your array>, <your array>, <your array>),
(<a new array containing 10>, ... <a new array containing 13>)
当您打印 <your_array>
的内容时,您将获得 4 个参考文献中的每一个的 3
,因为这是其当前内容。
在 fun2
中,当您在迭代的每一步打印数组的内容时,您将获得其连续的内容,因此 0、1、2、3。
我在 numpy 中有一个相当大的数组,并且想将值生成给管道中的下一个处理函数。我已经预先分配了 numpy 数组,因为我不想每次都分配内存。
在一个函数中我必须产生两个值,第一个应该在之后直接使用,第二个在几个管道阶段之后。
代码的简化版本如下所示:
import numpy as np
def numbers():
ret = np.array([0])
for i in range(4):
ret[0] = i
yield ret
def raw(gen):
for d in gen:
yield d
def add_ten(gen):
for d in gen:
yield d, d+10
def fun1():
nums = numbers()
g1, g2 = zip(*add_ten(nums))
for n1, n2 in zip(g1, g2):
print(n1, n2)
def fun2():
nums = numbers()
g = raw(nums)
for n in g:
print(n)
print("fun1")
fun1()
print("fun2")
fun2()
代码returns以下
fun1
[3] [10]
[3] [11]
[3] [12]
[3] [13]
fun2
[0]
[1]
[2]
[3]
生成器总是生成相同的引用,我只是更改了基础数据。很明显,如果我将数据收集到列表中,我会看到始终相同的值,因为只存储了引用。
但是,我不明白为什么 fun1
中的 g1
不起作用,而 fun2
中的 g
却按预期工作。
编辑: 我很感激这个问题的解决方法。
编辑: 在我的应用程序中,我再次将这些迭代器传递给函数,并在几步之后加入它们。
Thierry 已经有了解决方案,如果我直接使用这些值,谢谢你:)
def fun3():
nums = numbers()
g1, g2 = zip(*add_ten(nums))
h1 = raw(g1)
h2 = raw(g2)
for n1, n2 in zip(h1, h2):
print(n1, n2)
这是因为 *add_ten(nums)
发生在 g1, g2 = zip(*add_ten(nums))
中。
为了创建解压列表,add_tens
生成器立即耗尽。此列表将作为 zip
的参数,将包含:
(<your array>, <a new array containing 10>),
(<your array>, <a new array containing 11>),
(<your array>, <a new array containing 12>),
(<your array>, <a new array containing 13>),
由 add_ten
生成。
压缩后,您将拥有:
(<your array>, <your array>, <your array>, <your array>),
(<a new array containing 10>, ... <a new array containing 13>)
当您打印 <your_array>
的内容时,您将获得 4 个参考文献中的每一个的 3
,因为这是其当前内容。
在 fun2
中,当您在迭代的每一步打印数组的内容时,您将获得其连续的内容,因此 0、1、2、3。