NumPy数组维度不匹配。

3
我正在使用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 dataframe的末尾。

谢谢。

更新

看起来我可以将这两个现有数组连接起来:

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

然而,有效的方法是嵌套追加和连接。
np.concatenate((np.append(tmp, 17571), freqs),)
array([u'DNMT3A', u'p.M880V', u'chr2', 25457249, 17571,
       0.022831050228310501], dtype=object)

尽管这有点混乱。有人有更好的解决方案来连接多个异构数组吗?

2
虽然不是很好,但至少它不关心哪些东西是0d:np.concatenate(map(np.atleast_1d, [tmp, id, freqs])) - askewchan
@askewchan,太好了,至少_1d函数还没有引起我的注意。谢谢。 - alternate direction
1个回答

2
问题在于id,以及后面的integer np.array(17571),不是一个array_like对象。请参见此处,了解numpy如何决定对象是否可以自动转换为numpy数组。
解决方法是使id成为array_like,即成为listtuple的元素,这样numpy就会理解id属于一个1Darray_like结构。
总之,这一切都归结于:
concatenate((tmp, (id,), freqs))

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

为了避免在使用numpy函数处理输入变量时出现此类问题,您可以像@askewchan所指出的那样使用atleast_1d。有关详细信息,请参见问题/答案。

基本上,如果您不确定在不同的情况下您的变量id是单个str还是str列表,最好使用atleast_1d

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

因为如果id已经是字符串的列表/元组,上面两个选项都会失败。
编辑:可能不太明显为什么np.array(17571)不是一个array_like对象。这是因为np.array(17571).shape==(),所以它没有维度,无法迭代。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接