numpy数组维度不匹配

3 投票
1 回答
8218 浏览
提问于 2025-04-17 23:43

我正在使用numpy和pandas,想把一些不同类型的值合并成一个数组。

np.concatenate((tmp, id, freqs))

这里是具体的值:

tmp = np.array([u'DNMT3A', u'p.M880V', u'chr2', 25457249], dtype=object)
freqs = np.array([0.022831050228310501], dtype=object)
id = "id_23728"

变量tmp17232freqs的维度如下:

[in]  tmp.shape
[out] (4,)
[in]  np.array(17232).shape
[out] ()
[in]  freqs.shape
[out] (1,)

我也尝试把它们都转换成numpy数组,但没有成功。

不过,变量freqs通常会有多个值。

但是,当我使用np.concatenatenp.append这两个函数时,出现了以下错误:

*** ValueError: all the input arrays must have same number of dimensions

它们的列数都是(0),那为什么我不能用上面提到的numpy方法来合并它们呢?

我想得到的结果是[(tmp), 17232, (freqs)],并把它放到一个pandas数据框的末尾。

谢谢。

更新

看起来我可以合并这两个已有的数组:

np.concatenate([tmp, freqs],axis=0)
array([u'DNMT3A', u'p.M880V', u'chr2', 25457249, 0.022831050228310501], dtype=object)

不过,即使把整数转换成其他类型,也不能用来合并。

np.concatenate([tmp, np.array(17571)],axis=0)
*** ValueError: all the input arrays must have same number of dimensions

但是,嵌套使用append和concatenate是可行的。

np.concatenate((np.append(tmp, 17571), freqs),)
array([u'DNMT3A', u'p.M880V', u'chr2', 25457249, 17571,
       0.022831050228310501], dtype=object)

虽然这样有点麻烦。有没有人有更好的方法来合并多个不同类型的数组呢?

1 个回答

2

问题在于 id 和后面的 integer np.array(17571) 不是一个可以被当作数组的对象。你可以查看 这里,了解 numpy 是如何判断一个对象是否可以自动转换为 numpy 数组的。

解决办法是让 id 变成一个可以被当作数组的对象,也就是说,它需要是一个 listtuple 的元素,这样 numpy 才能理解 id 属于一个一维的数组结构。

归根结底就是

concatenate((tmp, (id,), freqs))

或者

concatenate((tmp, [id], freqs))

为了避免在使用 numpy 的函数中处理输入变量时出现这种问题,你可以使用 atleast_1d,正如 @askewchan 指出的那样。关于这个,你可以查看 这个问题/答案

基本上,如果你不确定在不同情况下你的变量 id 是一个单独的 str 还是一个 str 的列表,使用

concatenate((tmp, atleast_1d(id), freqs))

会更好,因为上面两种选项在 id 已经是一个字符串的列表或元组时会失败。

编辑:可能不太明显为什么 np.array(17571) 不是一个可以被当作数组的对象。这是因为 np.array(17571).shape==(),所以它没有维度,无法被迭代。

撰写回答