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

Posted

技术标签:

【中文标题】连接两个 NumPy 数组给出“ValueError:所有输入数组必须具有相同的维数”【英文标题】:Concatenating two NumPy arrays gives "ValueError: all the input arrays must have same number of dimensions" 【发布时间】:2018-12-18 15:40:55 【问题描述】:

标题 输出:

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

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

【问题讨论】:

你想如何组合这些?它们具有完全不同的形状。 Numpy 不能很好地处理锯齿状数组 【参考方案1】:

您尝试使用numpy.concatenate() 是对的,但您必须在连接之前将第一个数组提升为二维。这是一个简单的例子:

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 的原因是其中一个数组是一维的,而另一个是二维的。但是,numpy.concatenate 在这种情况下期望数组具有相同的维度。这就是我们使用None提升arr1 的数组维度的原因。但是,您也可以使用numpy.newaxis 代替None

【讨论】:

【参考方案2】:

您需要先对齐数组维度。您目前正在尝试组合一维和二维数组。对齐后可以使用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)

【讨论】:

【参考方案3】:

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

【讨论】:

感谢您提供的信息!我尝试了 vstack,并且遇到了类似的错误。但是,看起来两者具有相同数量的列 (7)。里面好像有问题?非常感谢, 每个数组的形状是什么?您可以检查(例如,对于 numpy 数组 barbar.shape。如果要堆叠,除了要堆叠的维度之外,每个维度都应该相同。 感谢您对 bar.shape 的建议——对重塑和检查结果非常有帮助。我让它工作了。

以上是关于连接两个 NumPy 数组给出“ValueError:所有输入数组必须具有相同的维数”的主要内容,如果未能解决你的问题,请参考以下文章

垂直连接两个 NumPy 数组

为啥 scipy sparse 和 numpy 数组的乘法函数会给出不同的结果?

垂直连接两个NumPy数组

numpy数组的堆叠:numpy.stack, numpy.hstack, numpy.vstack

Python入门第四十八天Python丨NumPy 数组连接

numpy 数组连接错误:0-d 数组无法连接