Numpy 将二维数组与一维数组连接起来
Posted
技术标签:
【中文标题】Numpy 将二维数组与一维数组连接起来【英文标题】:Numpy concatenate 2D arrays with 1D array 【发布时间】:2015-07-30 01:37:40 【问题描述】:我正在尝试连接 4 个数组,一个 1D 形状数组 (78427,) 和 3 个 2D 形状数组 (78427, 375/81/103)。基本上这是 4 个数组,包含 78427 个图像的特征,其中 1D 数组每个图像只有 1 个值。
我尝试如下连接数组:
>>> print X_Cscores.shape
(78427, 375)
>>> print X_Mscores.shape
(78427, 81)
>>> print X_Tscores.shape
(78427, 103)
>>> print X_Yscores.shape
(78427,)
>>> np.concatenate((X_Cscores, X_Mscores, X_Tscores, X_Yscores), axis=1)
这会导致以下错误:
Traceback(最近一次调用最后一次): 文件“”,第 1 行,在 ValueError: 所有输入数组的维数必须相同
问题似乎是一维数组,但我真的不明白为什么(它也有 78427 个值)。我尝试在连接一维数组之前对其进行转置,但这也没有用。
任何关于连接这些数组的正确方法的帮助将不胜感激!
【问题讨论】:
【参考方案1】:尝试连接 X_Yscores[:, None]
(或 X_Yscores[:, np.newaxis]
,如 imaluengo 建议的那样)。这会从一维数组中创建一个二维数组。
例子:
A = np.array([1, 2, 3])
print A.shape
print A[:, None].shape
输出:
(3,)
(3,1)
【讨论】:
只是指出A[:, np.newaxis]
与A[:, None]
具有相同的行为,并且有时可以更直观(实际上是np.newaxis == None
)。
但是,只有当两者具有相同的维度时,这才是正确的。在大多数情况下,我最终得到的数组 A 的形状为 (8400,),而数组 B 的形状为 (8399, 21)。如何截断/删除 A 的最后几行,以便 A 和 B 具有相同的形状,例如 (8399,) 和 (8399, 21) 。请指教。
np.newaxis
很直观,但我仍然不明白为什么A[:, None]
有效。谁能帮我理解这个?
之所以有效,是因为"newaxis
is an alias for None
" 并使用None
进行索引告诉 NumPy 添加维度。所以一维数组被转换成一个二维数组,它有轴 0 和轴 1。【参考方案2】:
你可以试试这个单行:
concat = numpy.hstack([a.reshape(dim,-1) for a in [Cscores, Mscores, Tscores, Yscores]])
这里的“秘密”是在一个轴上使用已知的通用尺寸进行整形,另一个轴使用-1,它会自动匹配大小(如果需要,创建一个新轴)。
【讨论】:
可以在这里提供帮助:***.com/questions/48676461/… 一个概括:np.concatenate([a.reshape(*shape,-1) for a in my_arrays],axis=-1),其中“shape”是已知维度的形状,除了最后。【参考方案3】:我不确定你是否想要这样的东西:
a = np.array( [ [1,2],[3,4] ] )
b = np.array( [ 5,6 ] )
c = a.ravel()
con = np.concatenate( (c,b ) )
array([1, 2, 3, 4, 5, 6])
或
np.column_stack( (a,b) )
array([[1, 2, 5],
[3, 4, 6]])
np.row_stack( (a,b) )
array([[1, 2],
[3, 4],
[5, 6]])
【讨论】:
对此有任何想法:***.com/questions/48676461/…以上是关于Numpy 将二维数组与一维数组连接起来的主要内容,如果未能解决你的问题,请参考以下文章
将 Pandas 系列的二维 numpy 数组转换为一维 numpy 数组列的 Pandas DataFrame
NumPy一维数组二维数组与Pandas的SeriesDataFrame行列结构和横纵方向的统一说明