NumPy学习(二)

本文深入探讨了NumPy的广播规则,解释了如何处理不同尺寸数组的算术运算,并展示了如何利用广播进行有效计算。此外,还介绍了NumPy的索引使用技巧,包括整数和布尔数组构建索引,以及ix_()函数的运用。同时,文章提到了线性代数的基础操作和一些实用的NumPy技巧,如自动变形和向量堆积。
摘要由CSDN通过智能技术生成

其他基本用法


广播(Broadcasting)


广播规则解释NumPy如何处理不同维度数组之间的算数运算问题。在一定条件下,维度较小的数组广播为更大的数组,使他们具有相同的维度形状。广播提供了一种向量化数组操作方法,使得循环发生在C而不是Python。广播不会产生没必要的数据复制,通常会使算法运行更加有效。缺点是,广播会使内存的使用效率降低,并影响计算速度。
NumPy运算执行在数组的每个元素基础上。如下所示,两个数组必须有相同的形状。

>>> a = np.array([1.0, 2.0, 3.0])
>>> b = np.array([2.0, 2.0, 2.0])
>>> a * b
array([ 2.,  4.,  6.])

当数组满足一定的约束时,NumPy的广播规则会降低形状必须相同的约束。广播的一个简单例子就是一个数组与一个数值进行运算。

>>> a = np.array([1.0, 2.0, 3.0])
>>> b = 2.0
>>> a * b
array([ 2.,  4.,  6.])

结果与第一个例子b为数组时相同。我们可以认为数值b在与数组a进行算数运算时被拉伸为与数组a相同的形状。数组b中的元素是复制数值b所得。我们通过拉伸来做概念上的类比,NumPy更加有效地利用原始数值而不是复制,使广播尽可能保证内存和计算的效率。

通用广播规则

NumPy在数组运算时会自动对比两个数组的形状。首先对比数组最后一轴的大小,依次向前对比。以下两种情况是兼容可运算的:
1. 形状相同
2. 其中一个维度为1

如果不符合运算条件,则会抛出ValueError: frames are not aligned异常,表明两个数组的形状不同不能运算。运算结果的数组形状每一维都是输入数组中的最大值。
数组不需要维度数相同。例如,你有一个256x256x3的三维RGB(颜色)值,你想将图像中的每维值用不同的数值等比例扩展。你可以用一个包含3个值得一维数组乘以图像数组。根据广播规则,对准图像数组最后一轴的大小,显示两者之间是可运算的:

Image  (3d array): 256 x 256 x 3
Scale  (1d array):             3
Result (3d array): 256 x 256 x 3

在两个数组的两个维度比较时,任何一个为1,则另一个即可计算。可以认为,维度为1即可以被拉伸复制去对应另一个数组的这一维。

A      (4d array):  8 x 1 x 6 x 1
B      (3d array):      7 x 1 x 5
Result (4d array):  8 x 7 x 6 x 5

更多例子如下所示:

A      (2d array):  5 x 4
B      (1d array):      1
Result (2d array):  5 x 4

A      (2d array):  5 x 4
B      (1d array):      4
Result (2d array):  5 x 4

A      (3d array):  15 x 3 x 5
B      (3d array):  15 x 1 x 5
Result (3d array):  15 x 3 x 5

A      (3d array):  15 x 3 x 5
B      (2d array):       3 x 5
Result (3d array):  15 x 3 x 5

A      (3d array):  15 x 3 x 5
B      (2d array):       3 x 1
Result (3d array):  15 x 3 x 5

不能广播的例子:

A      (1d array):  3
B      (1d array):  4 # 最后一维的元素个数不匹配

A      (2d array):      2 x 1
B      (3d array):  8 x 4 x 3 # 倒数第二维不匹配

实际应用的例子:

>>> x = np.arange(4)
>>> xx = x.reshape(4,1)
>>> y = np.ones(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值