我有一个defaultdict,它将某些整数映射到一个大小为20的numpy数组。
另外,我有一个现有的索引数组。我想将索引数组转换为2D数组,其中每个原始索引都通过我的defaultdict转换为数组。
最后,如果在defaultdict中找不到索引,我想为该索引创建一个零数组。
这是我到目前为止所拥有的
converter = lambda x: np.zeros((d), dtype='float32') if x == -1 else cVf[x]
vfunc = np.vectorize(converter)
cvf = vfunc(indices)
np.zeros((d), dtype='float32')
和cVf[x]
是相同的数据类型/形状:
(Pdb) np.shape(cVf[0])
(20,)
但是当我尝试运行此代码时,我在标题中遇到错误(*** ValueError:设置带序列的数组元素。)
有什么想法吗?
答案 0 :(得分:1)
你应该给我们一些示例数组或字典(在cVF
的情况下,所以我们可以进行测试运行。
阅读vectorize
关于返回值的内容。由于您没有定义otypes
,因此会进行测试计算以确定返回数组的dtype。我的第一个想法是测试计算和后续计算可能会返回不同的东西。但您声称converter
将始终返回相同的dtype和shape数组。
但是,让我们尝试更简单的事情:
In [609]: fv = np.vectorize(lambda x: np.array([x,x]))
In [610]: fv([1,2,3])
...
ValueError: setting an array element with a sequence.
它在返回任何阵列时遇到了麻烦。
但如果我给otypes
,它就可以了
In [611]: fv = np.vectorize(lambda x: np.array([x,x]), otypes=[object])
In [612]: fv([1,2,3])
Out[612]: array([array([1, 1]), array([2, 2]), array([3, 3])], dtype=object)
事实上,在这种情况下,我可以使用frompyfunc
,它返回对象dtype,并且是vectorize
的基础函数(并且更快一些)。
In [613]: fv = np.frompyfunc(lambda x: np.array([x,x]), 1,1)
In [614]: fv([1,2,3])
Out[614]: array([array([1, 1]), array([2, 2]), array([3, 3])], dtype=object)
vectorize
和frompyfunc
专为scalar in- scalar out
的功能而设计。该标量可能是一个对象,甚至是数组,但仍被视为标量。