文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-07-05 04:25

关注

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

楔子

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

删除维度、增加维度

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

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

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

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

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

import numpy as nparr = np.array([[1, 2, 3], [2, 3, 4]])print(arr.shape)  # (2, 3)# 很好理解print(np.expand_dims(arr, 0).shape)  # (1, 2, 3)print(np.expand_dims(arr, 1).shape)  # (2, 1, 3)print(np.expand_dims(arr, 2).shape)  # (2, 3, 1)arr = np.array([1, 2, 3])print(np.expand_dims(arr, 0))"""[[1 2 3]]"""print(np.expand_dims(arr, 1))"""[[1] [2] [3]]"""

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

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

import numpy as nparr = np.array([[1, 2, 3], [2, 3, 4]])print(arr.shape)  # (2, 3)arr1 = arr.reshape((2, 1, 1, 3))print(arr1)"""[[[[1 2 3]]] [[[2 3 4]]]]"""print(arr1.shape)  # (2, 1, 1, 3)print(np.all(arr1.reshape((2, 3)) == arr))  # True

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

import numpy as nparr = np.array([[1, 2, 3], [2, 3, 4]])print(arr.shape)  # (2, 3)# 将维度变成 (2, 1, 3, 1, 1)arr1 = arr[:, np.newaxis, :, np.newaxis, np.newaxis]print(arr1.shape)  # (2, 1, 3, 1, 1)# np.newaxis 等价于 Noneprint(arr[:, None, :, None, None].shape)  # (2, 1, 3, 1, 1)# 使用 : 的部分和之前的维度是对应的,np.newaxis 或者 None 可以理解成 1# 因此最终得到的数组的维度就是 (2, 1, 3, 1, 1)# 再以一维数组为例arr = np.array([1, 2, 3])print(arr)"""[1 2 3]"""# 得到的数组的 shape 为 (1, 3)print(arr[None, :])"""[[1 2 3]]"""# 得到的数组的 shape 为 (3, 1)print(arr[:, None])"""[[1] [2] [3]]"""

删除、增加一行或一列

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

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

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

删除一行或一列

首先是删除:

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

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

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

增加一行或一列

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

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

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

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

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

import numpy as nparr = np.arange(0, 12).reshape(3, 4)print(arr)"""[[ 0  1  2  3] [ 4  5  6  7] [ 8  9 10 11]]"""# 索引为 1 的位置插入一行,值全为 0print(np.insert(arr, 1, 0, axis=0))"""[[ 0  1  2  3] [ 0  0  0  0] [ 4  5  6  7] [ 8  9 10 11]]"""# 或者我们也可以手动指定print(np.insert(arr, 1, [0, 0, 0, 0], axis=0))"""[[ 0  1  2  3] [ 0  0  0  0] [ 4  5  6  7] [ 8  9 10 11]]"""# 二维数组也是可以的print(np.insert(arr, 1, [[0, 0, 0, 0], [0, 0, 0, 0]], axis=0))"""[[ 0  1  2  3] [ 0  0  0  0] [ 0  0  0  0] [ 4  5  6  7] [ 8  9 10 11]]"""# 插入一列,注意元素个数要匹配,每一列是 3 个元素print(np.insert(arr, 1, [[0, 0, 0], [0, 0, 0]], axis=1))"""[[ 0  0  0  1  2  3] [ 4  0  0  5  6  7] [ 8  0  0  9 10 11]]"""

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

import numpy as nparr = np.arange(0, 12).reshape(3, 4)print(arr)"""[[ 0  1  2  3] [ 4  5  6  7] [ 8  9 10 11]]"""# 在尾部增加一行print(np.insert(arr, arr.shape[0], 0, axis=0))"""[[ 0  1  2  3] [ 4  5  6  7] [ 8  9 10 11] [ 0  0  0  0]]"""# 在尾部增加一列print(np.insert(arr, arr.shape[1], 0, axis=1))"""[[ 0  1  2  3  0] [ 4  5  6  7  0] [ 8  9 10 11  0]]"""

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

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

以上就是关于“numpy怎么增加维度和删除维度”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯