连接两个NumPy数组将给出“ ValueError:所有输入数组必须具有相同数量的维数”

时间:2018-07-10 17:37:03

标签: python arrays numpy concatenation valueerror

标题 输出:

array(['Subject_ID', 'tube_label', 'sample_#', 'Relabel', 
      'sample_ID','cortisol_value', 'Group'], dtype='<U14')

身体 输出:

array([['STM002', '170714_STM002_1', 1, 1, 1, 1.98, 'HC'],
       ['STM002', '170714_STM002_2', 2, 2, 2, 2.44, 'HC'],], dtype=object)

testing = np.concatenate((header, body), axis=0)
ValueError                                Traceback (most recent call last) <ipython-input-302-efb002602b4b> in <module>()
      1 # Merge names and the rest of the data in np array
      2 
----> 3 testing = np.concatenate((header, body), axis=0)

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

有人可以解决此问题吗? 我尝试了不同的命令来合并两者(包括堆栈),并且遇到相同的错误。尺寸(列)似乎确实相同。

3 个答案:

答案 0 :(得分:3)

您尝试使用numpy.concatenate()是正确的,但是在连接之前,您必须将第一个数组提升到2D。这是一个简单的示例:

In [1]: import numpy as np

In [2]: arr1 = np.array(['Subject_ID', 'tube_label', 'sample_#', 'Relabel', 
   ...:       'sample_ID','cortisol_value', 'Group'], dtype='<U14')
   ...:       

In [3]: arr2 = np.array([['STM002', '170714_STM002_1', 1, 1, 1, 1.98, 'HC'],
   ...:        ['STM002', '170714_STM002_2', 2, 2, 2, 2.44, 'HC'],], dtype=object)
   ...:        

In [4]: arr1.shape
Out[4]: (7,)

In [5]: arr2.shape
Out[5]: (2, 7)

In [8]: concatenated = np.concatenate((arr1[None, :], arr2), axis=0)

In [9]: concatenated.shape
Out[9]: (3, 7)

结果连接的数组看起来像:

In [10]: concatenated
Out[10]: 
array([['Subject_ID', 'tube_label', 'sample_#', 'Relabel', 'sample_ID',
        'cortisol_value', 'Group'],
       ['STM002', '170714_STM002_1', 1, 1, 1, 1.98, 'HC'],
       ['STM002', '170714_STM002_2', 2, 2, 2, 2.44, 'HC']], dtype=object)

说明:

获得ValueError的原因是,其中一个数组是1D,而另一个数组是2D。但是,在这种情况下,numpy.concatenate期望数组的维数相同。这就是为什么我们使用arr1 提升 None的数组维度的原因。但是,您也可以使用numpy.newaxis代替None

答案 1 :(得分:0)

您需要先对齐数组尺寸。您当前正在尝试组合一维和二维数组。对齐后,您可以使用numpy.vstack

注意np.array([A]).shape返回(1, 7),而B.shape返回(2, 7)。一种更有效的替代方法是使用A[None, :]

还请注意,您的数组将成为dtype object,因为它将接受任意/混合类型。

A = np.array(['Subject_ID', 'tube_label', 'sample_#', 'Relabel', 
              'sample_ID','cortisol_value', 'Group'], dtype='<U14')

B = np.array([['STM002', '170714_STM002_1', 1, 1, 1, 1.98, 'HC'],
              ['STM002', '170714_STM002_2', 2, 2, 2, 2.44, 'HC'],], dtype=object)

res = np.vstack((np.array([A]), B))

print(res)

array([['Subject_ID', 'tube_label', 'sample_#', 'Relabel', 'sample_ID',
        'cortisol_value', 'Group'],
       ['STM002', '170714_STM002_1', 1, 1, 1, 1.98, 'HC'],
       ['STM002', '170714_STM002_2', 2, 2, 2, 2.44, 'HC']], dtype=object)

答案 2 :(得分:0)

查看numpy.vstack和hstack以及np.append中的axis参数。在这里看起来像您想要的vstack(即输出数组将具有3列,每列具有相同的行数)。您还可以查看numpy.reshape,以更改输入数组的形状,以便可以将它们连接起来。