gpt4 book ai didi

python - 这是 Python/Numpy 的 bug 还是微妙的陷阱?

转载 作者:行者123 更新时间:2023-12-02 19:23:42 40 4
gpt4 key购买 nike

考虑以下同一段代码的两种实现。我本以为它们是相同的,但事实并非如此。

这是一个 Python/Numpy 错误还是一个微妙的陷阱?如果是后者,什么规则可以清楚地表明为什么它不能按预期工作?

我正在处理多个数据数组,并且必须逐项处理每个数组,每个数组由一个表根据其元数据进行操作。

在现实世界的示例中,“n”是多个因素和偏移量,但以下代码仍然演示了我在除一种情况之外的所有情况下都得到错误结果的问题。

import numpy as np

# Change the following line to True to show different behaviour
NEEDS_BUGS = False # Changeme

# Create some data
data = np.linspace(0, 1, 10)
print(data)

# Create an array of vector functions each of which does a different operation on a set of data
vfuncd = dict()

# Two implementations
if NEEDS_BUGS:
# Lets do this in a loop because we like loops - However WARNING this does not work!!
for n in range(10):
vfuncd[n] = np.vectorize(lambda x: x * n)
else:
# Unwrap the loop - NOTE: Spoiler - this works
vfuncd[0] = np.vectorize(lambda x: x * 0)
vfuncd[1] = np.vectorize(lambda x: x * 1)
vfuncd[2] = np.vectorize(lambda x: x * 2)
vfuncd[3] = np.vectorize(lambda x: x * 3)
vfuncd[4] = np.vectorize(lambda x: x * 4)
vfuncd[5] = np.vectorize(lambda x: x * 5)
vfuncd[6] = np.vectorize(lambda x: x * 6)
vfuncd[7] = np.vectorize(lambda x: x * 7)
vfuncd[8] = np.vectorize(lambda x: x * 8)
vfuncd[9] = np.vectorize(lambda x: x * 9)

# Prove we have multiple different vectorised functions
for k, vfunc in vfuncd.items():
print(k, vfunc)

# Do the work
res = {k: vfuncd[k](data) for k in vfuncd.keys()}

# Show the result
for k, r in res.items():
print(k, r)


最佳答案

我不知道你到底想要实现什么,也不知道这是否是一个坏主意(就np.vectorize而言),但你面临的问题是因为the way python makes closures 。引用链接问题的答案:

Scoping in Python is lexical. A closure will alwaysremember the name and scope of the variable, not the object it'spointing to. Since all the functions in your example are created inthe same scope and use the same variable name, they always refer tothe same variable.

换句话说,当您对 n 进行关闭时,您实际上并没有关闭 n 的状态,而只是关闭了名称。因此,当 n 发生变化时,闭包中的值也会发生变化。这对我来说是很出乎意料的,但是others find it natural .

这是使用 partial 进行的一项修复:

from functools import partial
.
.
.

def func(x, n):
return x * n

for n in range(10):
vfuncd[n] = np.vectorize(partial(func, n=n))

或者使用工厂方法的另一个

def func_factory(n):
return lambda x: x * n

for n in range(10):
vfuncd[n] = np.vectorize(func_factory(n))

关于python - 这是 Python/Numpy 的 bug 还是微妙的陷阱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62680079/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com