numpy怎么增加维度和删除维度

其他教程   发布日期:2023年07月08日   浏览次数:450

这篇“numpy怎么增加维度和删除维度”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“numpy怎么增加维度和删除维度”文章吧。

楔子

在 TensorFlow 中,可以给一个 tensor 增加一个维度、删除一个维度,那么在 Numpy 中该怎么呢?

删除维度、增加维度

先来看看如何增加一个维度:

  1. import numpy as np
  2. arr = np.array([[[1, 2, 3], [2, 3, 4]]])
  3. print(arr)
  4. """
  5. [[[1 2 3]
  6. [2 3 4]]]
  7. """
  8. print(arr.shape) # (1, 2, 3)
  9. # 事实上第一个维度我们是不需要的,因为在该维度上数组的长度是 1
  10. # 删除第 1 个维度,我们看到已经改变了
  11. print(np.squeeze(arr, 0))
  12. """
  13. [[1 2 3]
  14. [2 3 4]]
  15. """

但是注意:只有数组长度在该维度上为 1,那么该维度才可以被删除。如果不是1,那么删除的话会报错。

  1. import numpy as np
  2. arr = np.array([[[1, 2, 3], [2, 3, 4]]])
  3. print(arr.shape) # (1, 2, 3)
  4. try:
  5. # 删除第二个维度,显然在第二个维度上数组的长度是 2,不是 1
  6. # 所以它不能被删除
  7. print(np.squeeze(arr, 1))
  8. except Exception as e:
  9. print(e) # cannot select an axis to squeeze out which has size not equal to one

删除只能删除数组长度为 1 所对应的维度,同理添加也是添加一个维度也只是让数组在这个维度上的长度变成 1,因为数组本来不存在这个维度的,但是我们强行加上了一个维度,那么数组在这个维度上的长度只能是 1。

  1. import numpy as np
  2. arr = np.array([[1, 2, 3], [2, 3, 4]])
  3. print(arr.shape) # (2, 3)
  4. # 很好理解
  5. print(np.expand_dims(arr, 0).shape) # (1, 2, 3)
  6. print(np.expand_dims(arr, 1).shape) # (2, 1, 3)
  7. print(np.expand_dims(arr, 2).shape) # (2, 3, 1)
  8. arr = np.array([1, 2, 3])
  9. print(np.expand_dims(arr, 0))
  10. """
  11. [[1 2 3]]
  12. """
  13. print(np.expand_dims(arr, 1))
  14. """
  15. [[1]
  16. [2]
  17. [3]]
  18. """

以上就实现了数组维度的删除和增加,因为数组的元素是固定的,所以在删除维度和增加维度时,数组在该维度上的长度必须是 1。

另外,变化维度还可以使用 reshape,比如 arr 的维度是 (2, 1, 3),我们把第二个维度给去掉的话,那么直接 arr.reshape((2, 3)) 即可,增加维度也是同理,只要变化维度前后的元素个数不变即可。

  1. import numpy as np
  2. arr = np.array([[1, 2, 3], [2, 3, 4]])
  3. print(arr.shape) # (2, 3)
  4. arr1 = arr.reshape((2, 1, 1, 3))
  5. print(arr1)
  6. """
  7. [[[[1 2 3]]]
  8. [[[2 3 4]]]]
  9. """
  10. print(arr1.shape) # (2, 1, 1, 3)
  11. print(np.all(arr1.reshape((2, 3)) == arr)) # True

最后,增加维度还有一种做法,但用的不多,举个栗子:

  1. import numpy as np
  2. arr = np.array([[1, 2, 3], [2, 3, 4]])
  3. print(arr.shape) # (2, 3)
  4. # 将维度变成 (2, 1, 3, 1, 1)
  5. arr1 = arr[:, np.newaxis, :, np.newaxis, np.newaxis]
  6. print(arr1.shape) # (2, 1, 3, 1, 1)
  7. # np.newaxis 等价于 None
  8. print(arr[:, None, :, None, None].shape) # (2, 1, 3, 1, 1)
  9. # 使用 : 的部分和之前的维度是对应的,np.newaxis 或者 None 可以理解成 1
  10. # 因此最终得到的数组的维度就是 (2, 1, 3, 1, 1)
  11. # 再以一维数组为例
  12. arr = np.array([1, 2, 3])
  13. print(arr)
  14. """
  15. [1 2 3]
  16. """
  17. # 得到的数组的 shape 为 (1, 3)
  18. print(arr[None, :])
  19. """
  20. [[1 2 3]]
  21. """
  22. # 得到的数组的 shape 为 (3, 1)
  23. print(arr[:, None])
  24. """
  25. [[1]
  26. [2]
  27. [3]]
  28. """

删除、增加一行或一列

说实话,改变数组的维度不是特别常见,更常见的是删除数组的一行或者一列,举个栗子:

  1. # 原始数组
  2. [[ 0 1 2 3]
  3. [ 4 5 6 7]
  4. [ 8 9 10 11]]
  5. # 我们希望删除一行
  6. [[ 0 1 2 3]
  7. [ 8 9 10 11]]
  8. # 或者删除一列
  9. [[ 0 2 3]
  10. [ 4 6 7]
  11. [ 8 10 11]]

这种需求相对来说更加常见一些,那么应该怎么做呢?我们来看一下。

删除一行或一列

首先是删除:

  1. import numpy as np
  2. arr = np.arange(0, 12).reshape(3, 4)
  3. print(arr)
  4. """
  5. [[ 0 1 2 3]
  6. [ 4 5 6 7]
  7. [ 8 9 10 11]]
  8. """
  9. # 假设删除第二行
  10. print(np.delete(arr, [1], axis=0))
  11. """
  12. [[ 0 1 2 3]
  13. [ 8 9 10 11]]
  14. """
  15. # 删除第一行和第三行
  16. print(np.delete(arr, [0, 2], axis=0))
  17. """
  18. [[4 5 6 7]]
  19. """
  20. # 删除前两行,slice(0, 2) 也可以换成 np.s_[0: 2]
  21. print(np.delete(arr, slice(0, 2), axis=0))
  22. """
  23. [[ 8 9 10 11]]
  24. """

删除列的话也是同理,只需要将 axis=0 换成 axis=1 即可,注意:如果不指定 axis 或者 axis 指定为 None,那么会 np.delete 会将传递的数组扁平化(变成一维数组),然后进行删除。举个栗子:

  1. arr = np.array([[1, 2, 3], [4, 5, 6]])
  2. print(arr)
  3. """
  4. [[1 2 3]
  5. [4 5 6]]
  6. """
  7. # 会将 arr 扁平化处理,然后删除索引为 1 的元素,因此要注意 axis 参数
  8. print(np.delete(arr, [1]))
  9. """
  10. [1 3 4 5 6]
  11. """

增加一行或一列

如果想增加一行或一列的话,要怎么做呢?

  1. import numpy as np
  2. arr = np.arange(0, 12).reshape(3, 4)
  3. print(arr)
  4. """
  5. [[ 0 1 2 3]
  6. [ 4 5 6 7]
  7. [ 8 9 10 11]]
  8. """
  9. # 在尾部增加一行,注意:这里的维度一定要匹配,指定 [0, 0, 0, 0] 是不行的,因为 arr 是一个二维数组
  10. print(np.append(arr, [[0, 0, 0, 0]], axis=0))
  11. """
  12. [[ 0 1 2 3]
  13. [ 4 5 6 7]
  14. [ 8 9 10 11]
  15. [ 0 0 0 0]]
  16. """
  17. # 在尾部增加一列,维度同样要匹配
  18. print(np.append(arr, [[0], [0], [0]], axis=1))
  19. """
  20. [[ 0 1 2 3 0]
  21. [ 4 5 6 7 0]
  22. [ 8 9 10 11 0]]
  23. """

如果不指定 axis,那么仍然会将传递的数组扁平化,然后进行追加:

  1. arr = np.array([[1, 2, 3], [4, 5, 6]])
  2. print(arr)
  3. print(np.append(arr, 0)) # [1 2 3 4 5 6 0]
  4. print(np.append(arr, [0, 0])) # [1 2 3 4 5 6 0 0]
  5. print(np.append(arr, [[0, 0]])) # [1 2 3 4 5 6 0 0]

append 默认是在尾部进行追加,并且还要求维度要匹配,不是很方便。所以这里更推荐 insert 函数:

  1. import numpy as np
  2. arr = np.arange(0, 12).reshape(3, 4)
  3. print(arr)
  4. """
  5. [[ 0 1 2 3]
  6. [ 4 5 6 7]
  7. [ 8 9 10 11]]
  8. """
  9. # 索引为 1 的位置插入一行,值全为 0
  10. print(np.insert(arr, 1, 0, axis=0))
  11. """
  12. [[ 0 1 2 3]
  13. [ 0 0 0 0]
  14. [ 4 5 6 7]
  15. [ 8 9 10 11]]
  16. """
  17. # 或者我们也可以手动指定
  18. print(np.insert(arr, 1, [0, 0, 0, 0], axis=0))
  19. """
  20. [[ 0 1 2 3]
  21. [ 0 0 0 0]
  22. [ 4 5 6 7]
  23. [ 8 9 10 11]]
  24. """
  25. # 二维数组也是可以的
  26. print(np.insert(arr, 1, [[0, 0, 0, 0], [0, 0, 0, 0]], axis=0))
  27. """
  28. [[ 0 1 2 3]
  29. [ 0 0 0 0]
  30. [ 0 0 0 0]
  31. [ 4 5 6 7]
  32. [ 8 9 10 11]]
  33. """
  34. # 插入一列,注意元素个数要匹配,每一列是 3 个元素
  35. print(np.insert(arr, 1, [[0, 0, 0], [0, 0, 0]], axis=1))
  36. """
  37. [[ 0 0 0 1 2 3]
  38. [ 4 0 0 5 6 7]
  39. [ 8 0 0 9 10 11]]
  40. """

我们看到 insert 比 append 要方便很多,并且功能也更加强大一些,并且 append 完全可以使用 insert 实现,举个栗子:

  1. import numpy as np
  2. arr = np.arange(0, 12).reshape(3, 4)
  3. print(arr)
  4. """
  5. [[ 0 1 2 3]
  6. [ 4 5 6 7]
  7. [ 8 9 10 11]]
  8. """
  9. # 在尾部增加一行
  10. print(np.insert(arr, arr.shape[0], 0, axis=0))
  11. """
  12. [[ 0 1 2 3]
  13. [ 4 5 6 7]
  14. [ 8 9 10 11]
  15. [ 0 0 0 0]]
  16. """
  17. # 在尾部增加一列
  18. print(np.insert(arr, arr.shape[1], 0, axis=1))
  19. """
  20. [[ 0 1 2 3 0]
  21. [ 4 5 6 7 0]
  22. [ 8 9 10 11 0]]
  23. """

最后,如果 insert 不指定维度,那么也是会先将数组扁平化,然后在进行 insert,举个栗子:

  1. arr = np.array([[1, 2, 3], [4, 5, 6]])
  2. print(np.insert(arr, 1, [0, 0])) # [1 0 0 2 3 4 5 6]

以上就是numpy怎么增加维度和删除维度的详细内容,更多关于numpy怎么增加维度和删除维度的资料请关注九品源码其它相关文章!