将整数映射到数组(Python):ValueError:使用序列

时间:2017-06-18 04:44:49

标签: python arrays numpy

我有一个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:设置带序列的数组元素。)

有什么想法吗?

1 个答案:

答案 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)

vectorizefrompyfunc专为scalar in- scalar out的功能而设计。该标量可能是一个对象,甚至是数组,但仍被视为标量。