在python中连接数组或列表数组以输出相同的数据类型

在python中连接数组或列表数组以输出相同的数据类型,python,numpy,concatenation,Python,Numpy,Concatenation,考虑以下数组 import numpy as np a1 = np.array([1,2,3],dtype='object') a2 = np.array([["A"],["D"],["R"]],,dtype='object') a3 = np.array([["A","F"],["D"],["R"]],dtype='object') 下面两个示例给出了不同类型的输出。没想到会这样。这正常吗 np.c_[a1,a2] #array([[1, 'A'], # [2, 'D'], #

考虑以下数组

import numpy as np
a1 = np.array([1,2,3],dtype='object')
a2 = np.array([["A"],["D"],["R"]],,dtype='object')
a3 = np.array([["A","F"],["D"],["R"]],dtype='object')
下面两个示例给出了不同类型的输出。没想到会这样。这正常吗

np.c_[a1,a2]

#array([[1, 'A'],
#      [2, 'D'],
#      [3, 'R']], dtype=object)

np.c_[a1,a3]

#array([[1, list(['A', 'F'])],
#      [2, list(['D'])],
#      [3, list(['R'])]], dtype=object)
为什么第一个表达式有效而第二个表达式无效?我看不出
a2
a3
之间有什么区别。此外,哪种连接方法(c_3;、堆栈、连接)将输出相同类型的输出,而不必添加其他代码行,例如检查输出数据类型并根据需要进行转换

np.concatenate((a1,a2),axis=0) # Error: ValueError: all the input arrays must have same number of dimensions

np.concatenate((a1,a3),axis=0) # works
#array([1, 2, 3, list(['A', 'F']), list(['D']), list(['R'])], dtype=object)

这实际上是有道理的,请参见每个阵列的类型:

a1 = np.array([1,2,3],dtype='object') => 1D array of objects, size 3
a2 = np.array([["A"],["D"],["R"]],,dtype='object') => 2D array of objects, size 3x1
a3 = np.array([["A","F"],["D"],["R"]],dtype='object') => 1D array of lists of objects
a3
是一个列表数组,因为np 2d(或更多-d)数组是矩阵,不能有1行大小为1,第二行大小为3,np计算效率很大程度上取决于数组在内存中的组织方式

因此,numpy将
np.array([[“A”、“F”]、[“D”]、[“R”]、dtype='object')
解释为列表数组(也是对象)。 使用其他类型尝试此操作将导致错误:

np.array([[1,2],[3],[4]],dtype=np.int64) -->
ValueError: setting an array element with a sequence.
因此,
np.连接((a1,a2),轴=0)
失败,因为a1是形状
(3,)
,a2是形状
(3,1)
,而a1和a3都是
(3,)

您可以通过以下方式解决此问题:

np.concatenate((a1,np.reshape(a2,a1.shape)))
np.concatenate((np.reshape(a1,a2.shape),a2))
两者都是有效的,每个都有不同的结果,没有一个解决方案,因为
a1
a2
之间的连接不明确

从:特别是,在升级到至少2-D后,阵列将沿其最后一个轴堆叠,1的立柱悬挂在形状上(列向量由1-D阵列构成)。这意味着
np.c
将首先将1D阵列转换为2D阵列,然后沿第二个轴连接。发生的情况如下:

如果是
np.c_Ua1,a2]

  • a1
    转换为
    [[1]、[2]、[3]]
  • 沿第二轴将
    [[1]、[2]、[3]]
    堆叠到
    [[[A]、[D]、[R]]
    ,结果是:

    [[1 'A']
     [2 'D']
     [3 'R']]
    
  • np.c.[a1,a3]
    的情况下:

  • a1
    转换为
    [[1]、[2]、[3]]
  • 尝试沿第二个轴将
    [[1]、[2]、[3]
    堆叠到
    [[“A”、“F”]、[“D”]、[“R”]
    。但是,numpy数组必须是矩形的,
    a3
    则不是。另一种方法是将每个列表解释为单个项,并按如下方式堆叠,以使数组成为矩形形状(3,2):

  • 根据您希望输出的方式,有不同的方法。如果您想简单地将1D/2D数组组合连接到1D中,可以首先
    挤压
    它们(删除大小为1的维度)并按如下方式连接:

    np.concatenate((np.squeeze(a1),np.squeeze(a2)),axis=0)
    #[1 2 3 'A' 'D' 'R']
    np.concatenate((np.squeeze(a1),np.squeeze(a3)),axis=0)
    #[1 2 3 list(['A', 'F']) list(['D']) list(['R'])]
    
    您还可以
    hstack
    将它们连接到所有内部列表的内容:

    np.concatenate((np.hstack(a1),np.hstack(a2)),axis=0)
    #[1 2 3 'A' 'D' 'R']
    np.concatenate((np.hstack(a1),np.hstack(a3)),axis=0)
    #['1' '2' '3' 'A' 'F' 'D' 'R']
    

    Numpy实际上并不是围绕着处理列表对象数组而设计的。你为什么要用这个?@juanpa.arrivillaga你对这种操作有什么建议。我需要横向附加a1和a2。您期望的常见行为是什么?看看
    a2
    a3
    。它们非常不同。您应该只使用python列表。为什么要使用numpy?
    np.concatenate((np.hstack(a1),np.hstack(a2)),axis=0)
    #[1 2 3 'A' 'D' 'R']
    np.concatenate((np.hstack(a1),np.hstack(a3)),axis=0)
    #['1' '2' '3' 'A' 'F' 'D' 'R']