我有一个numpy对象数组,其中包含几个索引号列表:
>>> idxLsts = np.array([[1], [0, 2]], dtype=object)
我定义了一个向量化函数,为每个列表附加一个值:
>>> idx = 99
>>> f = np.vectorize(lambda idxLst: idxLst.append(idx))
我调用了这个函数。我不关心返回值,只关注副作用。
>>> f(idxLsts)
array([None, None], dtype=object)
索引99被添加到第一个列表两次。为什么?我很难过。
>>> idxLsts
array([[1, 99, 99], [0, 2, 99]], dtype=object)
使用idxLsts的其他值,它不会发生:
>>> idxLsts = np.array([[1, 2], [0, 2, 4]], dtype=object)
>>> f(idxLsts)
array([None, None], dtype=object)
>>> idxLsts
array([[1, 2, 99], [0, 2, 4, 99]], dtype=object)
我的怀疑是它与文档有关:“定义一个矢量化函数,它将 嵌套 对象序列或numpy数组作为输入并返回一个numpy数组矢量化函数在输入数组的连续元组(如python map函数)上计算pyfunc,除了它使用numpy的广播规则。“
答案 0 :(得分:7)
来自vectorize
docstring:
The data type of the output of `vectorized` is determined by calling the function with the first element of the input. This can be avoided by specifying the `otypes` argument.
从代码中:
theout = self.thefunc(*newargs)
这是对thefunc
的额外调用,用于确定输出类型。这就是为什么第一个元素会附加两个99
。
在第二种情况下也会发生这种情况:
import numpy as np
idxLsts = np.array([[1, 2], [0,2,4]], dtype = object)
idx = 99
f = np.vectorize(lambda x: x.append(idx))
f(idxLsts)
print(idxLsts)
产量
[[1, 2, 99, 99] [0, 2, 4, 99]]
您可以使用np.frompyfunc
代替np.vectorize
:
import numpy as np
idxLsts = np.array([[1, 2], [0,2,4]], dtype = object)
idx = 99
f = np.frompyfunc(lambda x: x.append(idx), 1, 1)
f(idxLsts)
print(idxLsts)
产量
[[1, 2, 99] [0, 2, 4, 99]]