在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):
挤压它们(删除大小为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']