numpy数组维度不匹配
我正在使用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"
变量tmp
、17232
和freqs
的维度如下:
[in] tmp.shape
[out] (4,)
[in] np.array(17232).shape
[out] ()
[in] freqs.shape
[out] (1,)
我也尝试把它们都转换成numpy数组,但没有成功。
不过,变量freqs
通常会有多个值。
但是,当我使用np.concatenate
和np.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 个回答
问题在于 id
和后面的 integer
np.array(17571)
不是一个可以被当作数组的对象。你可以查看 这里,了解 numpy 是如何判断一个对象是否可以自动转换为 numpy 数组的。
解决办法是让 id
变成一个可以被当作数组的对象,也就是说,它需要是一个 list
或 tuple
的元素,这样 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==()
,所以它没有维度,无法被迭代。