Numpy基础入门(3) ndarray广播,切片,坐标轴

目录

1.广播机制

1.作为被广播的数组如果不满足维度要求,那么广播机制会在数组的shape元组的首位加一以调整维度

2.能用与广播操作的数组应满足每个维度上的元素数量与最大数量相等或者刚好为1

3.输出的数组结果形状由参与运算的数组在各个维度上最大值确定

4.对于维度上数值为1的轴,扩展时进行重复性填充

2.切片操作

3.坐标轴与维度


1.广播机制

Numpy法广播机制对数组操作来说是相当方便的操作机制之一。广播机制使得特定条件下的不同数组进行加减乘除操作,省去了因数组维度不同或者大小不同时扩展的相对麻烦的操作

广播机制运行规则:

1.作为被广播的数组如果不满足维度要求,那么广播机制会在数组的shape元组的首位加一以调整维度

例如:对一维数组a和二维数组b进行加和操作

  • 广播前

>>>a = np.array([1, 2, 3])

>>>b = np.array([[1, 2, 3], [4, 5, 6]])

>>>a

array([1, 2, 3])

>>>a.shape

(3,)

>>>b

array([[1, 2, 3]

        [4, 5, 6]])

>>>b.shape

(2,3)

  • 广播后(这一步不会体现在可视化界面上,只是用于理解)

第一步操作 

>>>a

array([[1, 2, 3]])

>>>a.shape

(1,3)

第二步操作

>>>a

array([[1, 2, 3]

        [1, 2, 3]])

>>>a.shape(== b.shape)

(2,3)

  • 结果

>>>a+b

array([[2,4,6],

        [5,7,9]]) 

2.能用与广播操作的数组应满足每个维度上的元素数量与最大数量相等或者刚好为1

例如:有一个形状为(4, 3, 8, 6)的数组A,那么对于不满足这个形状的数组B要与A进行加减操作时应该满足,B的形状应该是:

(1, 3, 8, 6)

(4, 1, 8, 6)

(4, 3, 1 6)

(4, 3, 8, 1)
(1, 1, 8, 6)(1, 3, 1, 6)
(1, 3, 8, 1)(4, 1, 1, 6)
(4, 1, 8, 1)(4, 3, 1, 1)
(1, 1, 1, 6)(1, 1, 8, 1)
(1, 3, 1, 1)(1, 1, 1, 1)

如果对于一个C数组,其维度数小于4,根据一规则,C应该如何满足广播机制来与A进行操作?

  • 对C来说,其维度数小于4,那么对应规则一,在其shape首位加入1,若还是小于,那么继续加入1最终以满足维度数达到4;由于C只能确定低维度下的数组状态,那么显而易见,其形状应该优先满足A的低维度形状 

3.输出的数组结果形状由参与运算的数组在各个维度上最大值确定

例如对于形状为(2, 1, 3)与形状为(1, 1, 6)的数组进行操作,那么输出应为形状为(2, 1, 6)

4.对于维度上数值为1的轴,扩展时进行重复性填充

具体可以参考第一条a由一维数组转化为二维数组的操作


 

2.切片操作

  • Numpy对array的切片操作类似于Python的列表切片操作
  • 不同的是,由于Numpy具有多个维度,那么切片多样性也较Python列表多样性更丰富

例如:

a = np.array([[1, 2, 3],

                [4, 5, 6],

                [7, 8, 9]])

a[1] = [4, 5, 6]  # 对于单个值来说,ndarray操作的是最高维的轴,也就是shape的第一个值

a[1:] = [[4, 5, 6],

        [7, 8, 9]]

a[1, 1] = 5  # 二维数组的不同维度用逗号进行分隔

a[1:, 1:] = [[5, 6],

                [8, 9]]

3.坐标轴与维度

理解ndarray的坐标轴和维度对ndarray的操作将会大大加深~

对于维度属性,ndarray的属性ndim展示了数组的维度数,而ndarray的属性shape则展示了每个维度上的元素个数;

对于shape属性,ndarray用axis(轴)来完成对每个维度上期望的操作:

  • axis的大小不能超过数组的ndim大小,即axis < ndim
  • axis本质上是对shape元组的操作,理解shape添加维度的机制有助于axis的操作理解正如前面所说到的那样,shape的维度添加都是添加到最前面的,

那么

  • axis=0一定是对最高维的操作,例如对(3, 2, 5)的数组来说axis=0操作的是3这个维度数上的数据;
  • axis=1是对shape第二个数据进行操作,对应上面的数字2;
  • axis=2是对shape最低维的数据进行操作.

  • axis对要操作的维度进行操作时,其他维度是“不动”的

仍然以上面为例,axis=0对3所在维度进行操作时,其操作状态应该是:

(?, constant,constant)

>>>a = np.random.randint(0, 10, size=(3, 2, 5))
[[[3 0 7 2 0]
  [4 1 7 5 2]]
[[9 7 3 0 3]
  [1 7 8 9 5]]
[[8 7 7 9 5]
  [9 9 5 5 9]]]

>>>a.sum(axis=0)
[[20 14 17 11  8]
 [14 17 20 19 16]]

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

꧁S༺༒༻Y꧂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值