NumPy hstack抛出" ValueError:所有输入数组必须具有相同数量的维度?"

时间:2018-01-14 19:39:03

标签: python arrays numpy

data = [['297348640', 'Y', '12', 'Y'],
       ['300737722','Y', '1', 'Y'],
       ['300074407', 'Y',  '1', 'N']]

我想将其转换为NumPy数组,所以我做了:

data = np.array(data)

以上工作正常。

现在我有两个清单,比如说

a = [0,2,6]
b = [21,21,9]

我必须在我之前的列表中添加这些内容:

data = [['297348640', 'Y', '12', 'Y', 0, 21],
       ['300737722','Y', '1', 'Y', 2, 21],
       ['300074407', 'Y',  '1', 'N', 6, 9]]

我尝试了这个,但它给了我错误的尺寸错误

a = np.array([a])
b = np.array([b])

data = np.hstack(data,(a))
data = np.hstack(data,(b))

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

2 个答案:

答案 0 :(得分:4)

与@cᴏʟᴅsᴘᴇᴇᴅ的解决方案类似,但不是传递dtype=object,而是通过传递data的dtype更明确:

data = np.array([['297348640', 'Y', '12', 'Y'],
                 ['300737722','Y', '1', 'Y'],
                 ['300074407', 'Y',  '1', 'N']])

a = [0,2,6]
b = [21,21,9]

a = np.array(a, dtype=data.dtype)
b = np.array(b, dtype=data.dtype)

data = np.hstack((data, a[:, None], b[:, None]))

np.hstack的第一个参数是数组序列。现在,您正在传递np.hstack(data,(a)),它实际上被解析为两个参数。添加一组额外的parantheses会将dataa(以及b)放入一个序列(元组)。

最后,关于索引:In numpy, what does selection by [:,None] do?。这模仿np.reshape()

答案 1 :(得分:2)

您当前的data数组是一个字符串数组,这意味着列堆栈整数列将导致强制转换为字符串。

因此,为防止这种情况,请在列堆叠期间将data转换为astype。

此外,ab的尺寸必须以某种方式匹配。对于列堆叠,它们需要是与data高度相同的列向量,以便可以完成堆叠。为此,您可以使用`np.reshape。

最后,对于堆叠,np.hstack / np.column_stack / np.concatenate一切正常。

np.concatenate(
   (data.astype(object), np.reshape(a, (-1, 1)), np.reshape(b, (-1, 1))), 
   axis=1
)

或者,

np.column_stack(
   (data.astype(object), np.reshape(a, (-1, 1)), np.reshape(b, (-1, 1)))
)

或者,

np.hstack(
   (data.astype(object), np.reshape(a, (-1, 1)), np.reshape(b, (-1, 1)))
)

array([['297348640', 'Y', '12', 'Y', 0, 21],
       ['300737722', 'Y', '1', 'Y', 2, 21],
       ['300074407', 'Y', '1', 'N', 6, 9]], dtype=object)