第二章 科学计算库Numpy 一、填空题昨天学了Numpy,我就把课后习题做了一下,趁热打铁,顺便将自己思路分享给大家。
以下题目都是自己手敲的,代码和题解也都是自己想的,有错误是正常现象,还望大家多多包涵!
1 . 在Numpy中,可以使用数组对象 ndarray 执行一些科学计算。
解析:可参考课本19页。
2 .如果 ndarry.ndim 执行的结果为2,则表示创建的是一个二维数组。
解析:维度:dimensions,ndim中的dim表示维度,n表示个数,应该是number of dimensions 的缩写,表示维度个数。
3 . Numpy 的数据类型是有一个类型名和元素位长 的数字组成。
解析: 数据类型可参考课本22-23页,类型后面的数字即表示位长。
4 . 如果两个数组的大小(ndarry.shape)不同,则他们进行算术运算时会出现广播体制。
解析:广播体制相关知识点可见课本25页。广播体制可大概理解为,两个数组做运算必须要行列数相等,如果不等的话就要找到他们相通点,比如行数相同,或者列数相同,然后不等的地方就用数组中已有的数字填充满构成等行等列的两个数组。因为1是所有数的约数,所以如果有长度为1的行或列存在就能任意变换长度生成等行等列的两个数组。
5 . 花式索引是 NumPy 的一个术语,是指用整数数组或列表进行索引。
解析:数组或列表作为答案不一定准确。课本的原话是: 花式索引是指将整数数组或列表作为索引,然后根据索引数组或索引列表的每个元素作为目标数组的下标在进行取值。
二、判断题
1 . 通过 empty() 函数创建的数组,该数组中没有任何元素。
答:错。
解析:通过empty() 函数创建一个新的数组,该数组分配了内存空间,它里面填充有随机元素,且数据类型默认为float64。具体用法可参考课本21页。
2 . 如果没有没有明确的指明数组中元素的类型,则默认为float64.
答:错。
解析:一般来说,使用zeros,ones,empty函数创建的数据类型都是float64;使用arange函数创建的数据类型就是int32(linux与mac系统是int64位),array函数创建的数据类型则要根据里面的参数而定。见图。
3 . 数组之间的任何算术运算都会将运算应用到元素级。
答:正确.
解析:可见课本24页-矢量化运算。
4 . 多维数组 *** 作索引时,可以将切片与整数索引混合使用。
答: 正确
解析:这么重要的切片可一定要会噢!见课本26-28页。
5 . 当通过布尔数组索引 *** 作数组时,返回的数据是布尔数组中的 False 对应位置的值。
答: 错误
解析:返回的是True对应位置的值。
三、选择题
1、下列选项中,用来表示数组维度的属性是(shape)。
解析: 可参考19-20页 ndarray 对象的常用属性。
2、下面代码中,创建的是一个3行3列数组的是(np.ones((3,3)))。
解析: ones函数表示的是创建一个 N x M 的二维数组,其里面的第一个参数是元组,应包含两个元素,表示行和列,且要用“()” 将两个元素包括。因此在np.ones((3,3)) 中是有两个括号包括的,一个括号表示的是ones函数,另一个括号表示这是一个元组。
3、 求下列程序的输出结果
arr_2d=np.array([[11,20,13],[14,25,16],[27,18,9]])
print(arr_2d[1,:1])
答: [14]
解析:花式切片确实够花式的,其中arr_2d[ ] 的第一个参数是行,第二个参数是列,都是从0开始数起。 那么第一个参数 1 就表示第一行,第二个参数 :1 表示 在[0,1)区间内的所有列数。因为是左闭右开不包括 1 ,所以这里就表示第0列。结合第一个参数,那么就是表示第 1 行 第 0 列的元素,在他们交叉部分,显然就只有一个,就是[14]。
4、略
坦白了,这题涉及到线性代数的矩阵转置的知识点,我忘了,不会。可参考课本30-31页。也可参考bilibili,有详细教学—>点此进入。
5、下列函数或方法中,用来表示矢量化三元表达式的是 where() 函数。
解析: where 函数是一个三元表达式,需要三个参数,第一个参数是布尔数据类型的数组,剩余两个也是数组。注意,这三个数组都应该是ndarry类型,而不是普通的列表,而且三个数组的形状应该是一样的,都要是同样的行数,同样的列数。它的作用相当于C语言的 a > b ? x:y,三目运算符,就是说如果布尔数组的元素值是真,就选A数组对应行列的元素,如果是假就选B数组对应行列的元素。其余函数可参考课本34-37页的内容。
五、程序题
1、创建一个数组,数组的 shape 为(5,0),元素都是0。
解析:这应该是很基础的基础题了,需要理解shape是啥。shape是表示数组的维度。numpy提供有一个专门创建全为0的数组的函数–zeros,可以一步到位。
但是刚 *** 作了一下发现好像不能创建5行0列的数组😅😅
后知后觉,根据我这两天学习numpy的经验,是不会出现shape为(5,0)情况的,看一下这种单列表转换成数组情形。
这种数组的shape是(5,)的形式,也不能够达到(5,0)的要求。根据课本19页shape的知识点可知,维度也不是从0数起的,所以应该不会出现(5,0)的情况,那么我们就暂时认定它所要求的形状是(5,1)–五行一列全为0的数组。
arr = arr = np.zeros((5,1),dtype=int) # 注意括号里面有个元组
arr
2、创建一个表示国际象棋的棋盘的 8 x 8 数组,其中,棋盘白格用0填充,棋盘黑格用1填充。
解析:我们先看一下棋盘图(网上找的)。
为表示棋盘,首先要创建一个 8 x 8 的数组。接下来该怎么做呢?容易想到的做法就是使用一个for循环,当单元格的行数是奇数,列数是奇数该怎么做,列数是偶数又该怎么做;当单元格的行数是偶数,列数是奇数该怎么做,列数是偶数又该怎么做。
这么做确实可以,但是判断条件有点多。或者我们想想看能不能用numpy函数来解决。
想到没? 😁😁
用 zeros函数 跟 eye 函数。大致找了一下书,里面好像没有eye这个函数,这个函数我是在老师的文件中看到的,而老师的文件又是跟书上配套的,这就有点😥…
那这里我大概说一下eye函数的用法。
eye函数可以生成一个除对角线是1外其他位置全为0的二维数组
eye(N,M,K=0,dtype="float64",...)
里面 N表示行,M表示列,K表示偏移量,K为整数。K>0时,对角线往上偏,K<0时,对角线往下偏,默认为0,即正对角线。还能定义数组的数据类型,默认为float64。最后还有一个默认参数order,我就不作深究。
为什么要用到eye函数?我们回顾一下棋盘可以发现,黑白格都是斜着交替出现的。我们就能够通过eye函数与zeros函数生成棋盘。zeros函数生成全是0的数组,eye函数生成对角线是1的数组,令他们相加后的结果,就是我们想要的。
1对应的是黑格,我们看一下eye函数K的取值范围。
因此可以得出,k的取值范围是[-7,7]。
下面我们看一下代码实现。
ar = np.zeros((8,8),dtype=int)
for i in range(-7,8,2): # range是左闭右开的,所以第二个参数是8,每隔一行出现一次。
eye = np.eye(8,8,i,dtype=int)
ar += eye
ar
额外练习
我这里提供些练习,大家可以看下,还是有意义的。本来这部分我也想好好写下解析的,但现在似乎不能这么做了…时间不够,我要抓紧时间准备竞赛了,上面的题解我也写了很长时间…希望大家理解一下,有问题的话欢迎评论区留言噢,我看到的话一定会回答你的!!
import numpy as np
num = sum(np.logspace(0,63,64,base=2))
num #结果 1.8446744073709552e+19
# s = 0
# for i in range(64):
# s += 2 ** i
# print(s)
# 得出的结果是 18446744073709551615
import numpy as np
rd = np.random.randint(0,101,24).reshape(4,6)
rd[rd<50] = 0
rd[rd>=50] = 1
rd
import numpy as np
nums = np.arange(1,10).reshape(3,3)
print(nums[:2,1:],"\n")
print(nums[1,:2],"\n")
print(nums[:2,-1],"\n")
print(nums[:,0])
写在最后
大家如有疑惑,欢迎评论区留言,看到我会立马回复的。如果这类文章会有不少人看的话,我以后会积极更新的。谢谢!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)