• Python中的np.split与MXNet中的nd.split的一些用法区别


    我们先来看下np.split的实现方法:

    1. @array_function_dispatch(_split_dispatcher)
    2. def split(ary, indices_or_sections, axis=0):
    3. try:
    4. len(indices_or_sections)
    5. except TypeError:
    6. sections = indices_or_sections
    7. N = ary.shape[axis]
    8. if N % sections:
    9. raise ValueError(
    10. 'array split does not result in an equal division') from None
    11. return array_split(ary, indices_or_sections, axis)

    当然有兴趣的可以继续看array_split的具体操作方法。

    从split的定义可以看到,参数是(数组,数或数组,维度)返回值是列表,里面的每组元素是数组。看示例:
    参数是整数

    1. import numpy as np
    2. a=np.arange(10)
    3. np.split(a,5)
    4. #[array([0, 1]), array([2, 3]), array([4, 5]), array([6, 7]), array([8, 9])]

    将0-9,均分成5份。如果不能被整除,比如是4,将出现错误:
    ValueError: array split does not result in an equal division

     参数是列表,按照里面每个值来分段

    1. a=np.arange(10)
    2. np.split(a,[4,8])
    3. #[array([0, 1, 2, 3]), array([4, 5, 6, 7]), array([8, 9])]

    变形成二维数组来切分

    1. a=np.arange(40).reshape(8,5)
    2. np.split(a,4)
    3. '''
    4. [array([[0, 1, 2, 3, 4],
    5. [5, 6, 7, 8, 9]]),
    6. array([[10, 11, 12, 13, 14],
    7. [15, 16, 17, 18, 19]]),
    8. array([[20, 21, 22, 23, 24],
    9. [25, 26, 27, 28, 29]]),
    10. array([[30, 31, 32, 33, 34],
    11. [35, 36, 37, 38, 39]])]
    12. '''

    axis=1的结果

    1. a=np.arange(40).reshape(5,8)
    2. np.split(a,4,axis=1)
    3. '''
    4. [array([[ 0, 1],
    5. [ 8, 9],
    6. [16, 17],
    7. [24, 25],
    8. [32, 33]]),
    9. array([[ 2, 3],
    10. [10, 11],
    11. [18, 19],
    12. [26, 27],
    13. [34, 35]]),
    14. array([[ 4, 5],
    15. [12, 13],
    16. [20, 21],
    17. [28, 29],
    18. [36, 37]]),
    19. array([[ 6, 7],
    20. [14, 15],
    21. [22, 23],
    22. [30, 31],
    23. [38, 39]])]
    24. '''

    接下来的nd.split的用法跟np.split虽然用法很像,还是存在一些区别需要注意。

    还是贴下nd.split的方法:

    1. def split(data=None, num_outputs=_Null, axis=_Null, squeeze_axis=_Null, out=None, name=None, **kwargs):
    2. return (0,)

    跟np.split的区别就是必须指定axis,不然会报错。

    1. from mxnet import nd
    2. a=nd.arange(40).reshape(8,5)
    3. nd.split(a,4,axis=0)
    4. '''
    5. [
    6. [[0. 1. 2. 3. 4.]
    7. [5. 6. 7. 8. 9.]]
    8. ,
    9. [[10. 11. 12. 13. 14.]
    10. [15. 16. 17. 18. 19.]]
    11. ,
    12. [[20. 21. 22. 23. 24.]
    13. [25. 26. 27. 28. 29.]]
    14. ,
    15. [[30. 31. 32. 33. 34.]
    16. [35. 36. 37. 38. 39.]]
    17. ]
    18. '''

    三维的例子亦如是,如:切分第二维切4份

    1. a=nd.arange(40).reshape(2,4,5)
    2. nd.split(a,4,axis=1)
    3. '''
    4. [
    5. [[[ 0. 1. 2. 3. 4.]]
    6. [[20. 21. 22. 23. 24.]]]
    7. ,
    8. [[[ 5. 6. 7. 8. 9.]]
    9. [[25. 26. 27. 28. 29.]]]
    10. ,
    11. [[[10. 11. 12. 13. 14.]]
    12. [[30. 31. 32. 33. 34.]]]
    13. ,
    14. [[[15. 16. 17. 18. 19.]]
    15. [[35. 36. 37. 38. 39.]]]
    16. ]
    17. '''

    每个元素的形状是nd.split(a,4,axis=1)[1].shape #(2,1,5)

    除了参数名称不一样,个数也不一样,比如squeeze_axis这个新增的参数,可以减掉一维。

    1. a=nd.arange(40).reshape(2,4,5)
    2. nd.split(a,2,axis=0,squeeze_axis=1)
    3. '''
    4. [
    5. [[ 0. 1. 2. 3. 4.]
    6. [ 5. 6. 7. 8. 9.]
    7. [10. 11. 12. 13. 14.]
    8. [15. 16. 17. 18. 19.]]
    9. ,
    10. [[20. 21. 22. 23. 24.]
    11. [25. 26. 27. 28. 29.]
    12. [30. 31. 32. 33. 34.]
    13. [35. 36. 37. 38. 39.]]
    14. ]
    15. '''

    看出有什么不同了吗?少了一维,本来里面每个元素是 1x4x5 @cpu(0)>,现在变为
    再看一例:

    1. a=nd.arange(40).reshape(2,4,5)
    2. nd.split(a,4,axis=1,squeeze_axis=1)
    3. '''
    4. [
    5. [[ 0. 1. 2. 3. 4.]
    6. [20. 21. 22. 23. 24.]]
    7. ,
    8. [[ 5. 6. 7. 8. 9.]
    9. [25. 26. 27. 28. 29.]]
    10. ,
    11. [[10. 11. 12. 13. 14.]
    12. [30. 31. 32. 33. 34.]]
    13. ,
    14. [[15. 16. 17. 18. 19.]
    15. [35. 36. 37. 38. 39.]]
    16. ]
    17. '''

    如果没有squeeze_axis=1这个参数,里面的元素形状是1x5 @cpu(0)>, 现在变为
    所以这个其实就是将所在切分的维,有且仅有1,那么就减掉这个维度。这个其实是有意义的,毕竟属于没数据的占着空的维度,可以去掉。

  • 相关阅读:
    深度解读ChatGPT基本原理
    8函数相关内容
    C#WPF用户控件及自定义控件实例
    操作系统存储管理
    dubbo-admin在jdk1.8下报错问题(已解决)
    论文投稿指南——收藏|SCI论文投稿注意事项
    29.5.3 恢复准备
    寻找和利用 XXE – XML 外部实体注入
    网工内推 | 网络安全工程师,上市公司,13薪,食宿有补贴
    C++基础知识(十四)--- vector容器
  • 原文地址:https://blog.csdn.net/weixin_41896770/article/details/127952068