详解NumPy与Pandas数组的合并及内存顺序拆分

云舒
云舒
发布时间:2026-10-13 | 5人浏览过
原创

本文详细解析了NumPy和Pandas中数组的合并与拆分技术。在合并方面,介绍了利用concatenate和concat方法通过指定axis参数实现纵轴与横轴拼接,并强调了Pandas中需将DataFrame置于列表中的差异。在拆分与内存布局方面,阐述了C语言(行优先)与Fortran(列优先)顺序的区别,以及如何通过order参数控制reshape和ravel操作,帮助开发者深入理解底层内存布局对数据处理的影响。

合并

在NumPy库中

可以使用concatenate函数来合并两个数组。通过设置axis参数为0或1,分别实现在纵轴(垂直方向)和横轴(水平方向)上的合并操作。

import numpy as np
import pandas as pd
arr1=np.ones((3,5))
arr1
Out[5]: 
array([[ 1., 1., 1., 1., 1.],
    [ 1., 1., 1., 1., 1.],
    [ 1., 1., 1., 1., 1.]])
arr2=np.random.randn(15).reshape(arr1.shape)
arr2
Out[8]: 
array([[-0.09666833, 1.47064828, -1.94608976, 0.2651279 , -0.32894787],
    [ 1.01187699, 0.39171167, 1.49607091, 0.79216196, 0.33246644],
    [ 1.71266238, 0.86650837, 0.77830394, -0.90519422, 1.55410056]])
np.concatenate([arr1,arr2],axis=0) #在纵轴上合并
Out[9]: 
array([[ 1.    , 1.    , 1.    , 1.    , 1.    ],
    [ 1.    , 1.    , 1.    , 1.    , 1.    ],
    [ 1.    , 1.    , 1.    , 1.    , 1.    ],
    [-0.09666833, 1.47064828, -1.94608976, 0.2651279 , -0.32894787],
    [ 1.01187699, 0.39171167, 1.49607091, 0.79216196, 0.33246644],
    [ 1.71266238, 0.86650837, 0.77830394, -0.90519422, 1.55410056]])
np.concatenate([arr1,arr2],axis=1) #在横轴上合并
Out[10]: 
array([[ 1.    , 1.    , 1.    , ..., -1.94608976,
     0.2651279 , -0.32894787],
    [ 1.    , 1.    , 1.    , ..., 1.49607091,
     0.79216196, 0.33246644],
    [ 1.    , 1.    , 1.    , ..., 0.77830394,
    -0.90519422, 1.55410056]])
np.hstack([arr1,arr2]) # 水平 horizon 
np.vstack([arr1,arr2]) # 垂直 vertical 

在Pandas库中

合并操作主要通过concat方法完成。同样可以通过指定axis参数为0或1,在纵轴或横轴上合并两个数组。需要注意的是,与NumPy不同,Pandas要求将待合并的两个DataFrame对象放入一个列表中,例如[frame1, frame2],作为concat函数的第一个参数。

from pandas import DataFrame
frame1=DataFrame([[1,2,3],[4,5,6]])
frame2=DataFrame([[7,8,9],[10,11,12]])
pd.concat([frame1,frame2],ignore_index=True) # 合并的数组是一个可迭代的列表。
Out[25]: 
  0  1  2
0  1  2  3
1  4  5  6
0  7  8  9
1 10 11 12
pd.concat([frame1,frame2],axis=1,ignore_index=True)
Out[27]: 
  0 1 2  3  4  5
0 1 2 3  7  8  9
1 4 5 6 10 11 12

拆分

默认情况下,NumPy数组采用行优先顺序创建。从内存空间的角度来看,这意味着对于二维数组,同一行中的数据项在内存中是连续存储的。另一种常见的存储顺序是列优先。

受历史因素影响,行优先和列优先顺序分别被称为C顺序和Fortran顺序。在NumPy中,可以通过关键字参数order='C'来指定行优先顺序,或通过order='F'来指定列优先顺序,从而控制数组的内存布局。

arr=np.arange(15).reshape(3,-1)
arr
Out[29]: 
array([[ 0, 1, 2, 3, 4],
    [ 5, 6, 7, 8, 9],
    [10, 11, 12, 13, 14]])
arr.ravel('F') #按照列优先,扁平化。
Out[30]: array([ 0, 5, 10, ..., 4, 9, 14])
arr.ravel()
Out[31]: array([ 0, 1, 2, ..., 12, 13, 14])
arr.reshape((5,3),order='F') # Fortran 顺序
Out[32]: 
array([[ 0, 11, 8],
    [ 5, 2, 13],
    [10, 7, 4],
    [ 1, 12, 9],
    [ 6, 3, 14]])
 arr.reshape((5,3),order='C')
 Out[33]: 
array([[ 0, 1, 2],
    [ 3, 4, 5],
    [ 6, 7, 8],
    [ 9, 10, 11],
    [12, 13, 14]])

以上内容是对NumPy和Pandas中数组合并与拆分操作的详细解析,希望能为读者提供有价值的参考。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表