numpy-100(附答案、详细注释和知识点拓展)

Numpy-100(numpy100道练习题)原项目地址:https://github.com/rougier/numpy-100

本文在numpy-100(numpy100道练习题)原项目(带solution版)地基础上,将部分练习的答案替换为了更常见、更易想的解法,并为原项目中每一题的解答添加了较详细的注释以及部分相应知识点的介绍和扩展。
(未完成版)

#1、Import the numpy package under the name np      
   #导入数值计算numpy库并命名为np
import numpy as np 
#2、Print the numpy version(版本) and the configuration(组态,配置)
print(np.__version__)
#__xx__”一般是操作符或本地函数调用的magic methods;
#也就是说调用__xx__的应是python本身,而不是用户。
np.show_config()
#调用numpy的show_config()方法,显示numpy详细配置; 
#注:动词_名词 是调用方法的常见形式;
#熟练掌握该规则和英文,可以推断出自己想要的功能该怎么实现。
#3、Create a null vector of size 10
   #创建一个长度为10且元素均为零的向量
np.zeros(10)
#4、How to find the memory size of any array。
    #memory:记忆。 memory size:内存大小;
    #本题要求获取任意数组的内存大小
def getmemorysize(a):
    print((a.size *a.itemsize),"bytes") 
    #任意一词,要求泛化能力,因此需定义函数来完成要求
    #numpy的.size属性返回数组所有元素个数;
    #.shape属性返回数组每维的大小;
    #.itemsize返回当前数组中每个元素所占空间大小
    #.size *. itemsize表示数组元素数*每个元素所占的空间,即内存

x=np.array([10,30])#测试我们定义的getmemorysize函数
getmemorysize(x)#返回16bytes(16字节)
#注:为了与python属性、函数进行区分,很多numpy属性、函数,
#都在原本的形式前加了一个a。例如:python的range()和numpy的
#.arange
#5、How to get the documentation of the numpy add function from the command line? 
#command line:命令行;documentation:文件、文档。
#如何从命令行获取numpy add函数的文档
%run `python -c "import numpy; numpy.info(numpy.add)"` 
#这是命令行实现的方法

np.info(np.add)
#这是在notebook中获取的方法,info:information 信息
#6、 Create a null vector of size 10 but the fifth value which is 1
#创建一个十个元素的空向量,要求其第五个元素是1
vector_1=np.zeros(10) 
#注意,如果用此方法创建的是高维的张量,则size需要套括号。
#例如np.zeros((2,3)),创建两行三列纯0二维数组
vector_1[4]=5 #注意索引从零开始,第五个元素的索引是4
print(vector_1)
#7、Create a vector with values ranging from 10 to 49
vector_2=np.arange(10,50)
#.arange方法创建左闭右开区间内的序列
#arange是pythonn内置range在numpy中的扩展,支持浮点数步长
#例如np.arange(1,10,1.5),创建[1,10)之间,1.5为步长的序列
print(vector_2)
#8、Reverse a vector (first element becomes last)
#颠倒一个向量。element:要素、元素,Reverse:颠倒、反转
print(vector_2)#沿用问题7中创建的vector_2
vector_3=vector_2[::-1]#切片取法,借助反向递减序列进行反向
#以-1为步长,取遍整个向量。
#python的反向递减序列,最后一个元素索引为-1,往前依次减1
print(vector_3)
#9、Create a 3x3 matrix with values ranging from 0to8
#创建一个3乘3矩阵,其元素为0、1、...、8
matrix_1=np.arange(9).reshape(3,3)
#连续调用两个方法,先创建一个[0,9)间以1为步长的向量,
#再将该向量变形为3*3矩阵。变形时元素默认按行排列
print(matrix_1)
#10、Find indices of non-zero elements from [1,2,0,0,4,0] 
#寻找[1,2,0,0,4,0] 中非零元素的索引
vector_4=np.array([1,2,0,0,4,0])
print(np.nonzero(vector_4))
#.nonzero(x)方法,返回numpy数组x中非0元素的索引
#nonzero:none zero 非零
#再次提示:python及其多数库中,实现某功能的函数,往往就是这个函数的英文词汇或者缩写
#11、Create a 3x3 identity matrix 
#生成3*3单位矩阵
#identity:同一性,一致性,身份;identity matrix:单位矩阵
#方法一
matrix_2=np.eye(3) 
#生成对角矩阵,
#方法为numpy.eye(N,M=None, k=0, dtype=)
#其中第一个参数代表方阵大小,
#第三个参数代表主对角线右上方第k对角线元素全为1,其余元素全为0
print(matrix_2)
#方法二
matrix_2=np.identity(3)
#直接生成单位矩阵
print(matrix_2)
#方法三
matrix_2=np.diag([1,1,1])
print(matrix_2)
np.diag(matrix_2)#返回[1,1,1]
#numpy.diag()返回一个矩阵的对角线元素,或者创建一个对角阵!
#12、Create a 3x3x3 array with random values
#生成一个3*3*3的随机数组 
array_1=np.random.random((3,3,3))
#生成元素值在(0,1)间,具有确定shape的随机数,多用于分类等任务
print(array_1)
#numpy常用随机数函数:
#(1)np.random.normal(loc, scale, [size])   loc:均值;scale标准差;size:输出的shape。默认为 0,1,none,即均值0标准差1,一个数据
#(2)np.random.randn(size)为标准正态分布(μ=0,σ=1)
#(3)np.random.uniform(low, high, (size))#从一个均匀分布[low,high)中随机采样,即包含low,不包含high,size为输出的shape
#(4)np.random.randint(下限,上限,(size))#产生随机整数,例如
#(5)np.random.random_sample((size)) #在[0.0,1.0)上随机采样,这与np.random.random((size))等价
#(6)np.random_intergers(下限,上限,(size)) #闭区间随机整数
#(7)np.random.rand(size)生成[0,1)间的随机服点数组
#13、Create a 10x10 array with random values and find the minimum and maximum values
array_2=np.random.random((10,10))
arrmin, arrmax = array_2.min(), array_2.max() 
#取最值并赋值给变量
print(array_2)
print(arrmin, arrmax)
#14、Create a random vector of size 30 and find the   mean value
#寻找均值
vector_5=np.random.random(30)
print(vector_5.mean())
#15、Create a 2d array with 1 on the border and 0 inside
#创建一个内部元素为0边缘元素为1的二维数组
matrix_3=np.ones((10,10))
matrix_3[1:-1,1:-1]=0
#注意,变量名[索引]赋值会直接改变原数组,而非生成副本
#第二行到最后倒数第二行、第二列到倒数第二列,全部赋值为0
#注意,变量名[a:b]同样是取[a,b)区间
print(matrix_3)
#16、How to add a border (filled with 0's) around an existing array? 
#用0元素为已存在的矩阵添加一个边缘
matrix_4 = np.ones((3,3))
matrix_4 = np.pad(matrix_4, pad_width=1, mode='constant', constant_values=0)
#pad_width=1表示在周边添加一圈
#array=np.pad(array, pad_width, mode, **kwargs)
#array为要填充的数组,pad_width表示表示每个轴(axis)边缘需要填充的数值数目。 
#mode——表示填充的方式(取值:str字符串或用户提供的函数),总共有11种填充模式;
#‘constant’——表示连续填充相同的值,每个轴可以分别指定填充值,constant_values=(x, y)时前面用x填充,后面用y填充,缺省值填充0
#‘edge’——表示用边缘值填充
#‘linear_ramp’——表示用边缘递减的方式填充
#‘maximum’——表示最大值填充
#‘mean’——表示均值填充
#‘median’——表示中位数填充
#‘minimum’——表示最小值填充
#**kwargs代表填充值,不需要时可以省略。
#例如:
'''
import numpy as np
array = np.array([1, 1, 1])
# (1,2)表示在一维数组array前面填充1位,最后面填充2位
#  constant_values=(0,2) 表示前面填充0,后面填充2
ndarray=np.pad(array,(1,2),'constant', constant_values=(0,2)) 

import numpy as np
array = np.array([[1, 1],[2,2]])
#((1,1),(2,2))表示在二维数组array第一维(此处便是行)前面填充1行,最后面填充1行,第二维(此处便是列)前面填充2列,最后面填充2列
#constant_values=(0,3) 表示第一维填充0,第二维填充3
ndarray=np.pad(array,((1,1),(2,2)),'constant', constant_values=(0,3)) 
'''
print(matrix_4)

#17、 What is the result of the following expression?
#以下表达式的结果是什么
print(0 * np.nan) 
#输出nan
print(np.nan == np.nan)
#输出False
#注意nan不能比较判断
print(np.inf > np.nan)
#输出false,(nan不能用于比较)
print(np.nan - np.nan)
#输出nan,nan参与的算数运算的结果必然是nan
print(np.nan in set([np.nan]))
#返回True
#set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
print(0.3 == 3 * 0.1)
#输出False
#注意浮点数与二进制的对应,浮点数不能完全精确的表示。
#计算机数据的存储实质上都是二进制格式的
#18、Create a 5x5 matrix with values 1,2,3,4 just below the diagonal
#创建一个主对角线下方对角线值为1,2,3,4的5*5方阵
#diagonal:对角线的
#法一
matrix_5=np.diag([1,2,3,4],-1)
#设置主对角线下方对角线的值为[1,2,3,4],
#注意某一对角线的值的数目,直接决定了方阵的维度
print(matrix_5)
#法二
matrix_5 = np.diag(1+np.arange(4),k=-1)
print(matrix_5)
#19、Create a 8x8 matrix and fill it with a checkerboard pattern
#创建一个8*8棋盘矩阵    
#pattern:图案,checkerboard:棋盘
matrix_6= np.zeros((8,8))
matrix_6[1::2,::2] = 1
#这一步涉及的元素索引
#(1,0)、(1,2)、...、(1,8)
#(3,0)、(3,2)、...、(3,8)
# ...    ...  ...   ...
#(7,0)、(7,2)、...、(7,8)
matrix_6[::2,1::2] = 1

print(matrix_6)
'''
输出结果为
[[0. 1. 0. 1. 0. 1. 0. 1.]
 [1. 0. 1. 0. 1. 0. 1. 0.]
 [0. 1. 0. 1. 0. 1. 0. 1.]
 [1. 0. 1. 0. 1. 0. 1. 0.]
 [0. 1. 0. 1. 0. 1. 0. 1.]
 [1. 0. 1. 0. 1. 0. 1. 0.]
 [0. 1. 0. 1. 0. 1. 0. 1.]
 [1. 0. 1. 0. 1. 0. 1. 0.]]
'''
#20、Consider a (6,7,8) shape array, what is the index (x,y,z) of the 100th element?
#考虑一个6*7*8数组,单索引号99(第100个元素),对应的三维索引是什么
print(np.unravel_index(99,(6,7,8)))
#numpy.unravel_index()函数;
#获取一个int类型的索引值在一个多维数组中的位置。
#unravel:阐释,说明
#unravel_index():.说明_索引,正是前面所说的.动词_名词结构
#掌握了这个规律,就可以不必大量记忆函数。
#程序设计语言很多,更新换代速度也不慢;
#即使是同一门语言,不同版本、相同作用的方法也不一致。
#学程序设计,重在思维模式,而不应只关注某种语言本身的各种实现。
#21、Create a checkerboard 8x8 matrix using the tile function      
#用平铺函数创建8*8棋盘矩阵;tile:铺瓦,平铺显示
matrix_7=np.tile(np.array([[0,1],[1,0]]), (4,4))
#将原数组横向、纵向复制为四个,铺成矩阵!
print(matrix_7)
#Numpy的 tile() 函数,是将原矩阵横向、纵向地复制。tile 是瓷砖的意思,顾名思义,这个函数就是把数组像瓷砖一样铺展开来。
#
#22、 Normalize a 5x5 random matrix      
#normalize:标准化
matrix_8=np.random.random((5,5))
matrix_8=(matrix_8 - np.mean (matrix_8))/(np.std (matrix_8))
print(matrix_8)
#矩阵标准化的目的是,得到均值为0,标准差为1的服从标准正态分布的数据。
#注意:np.mean()和np.std()用法
''''
numpy.mean(a, axis, dtype, out,keepdims )
mean()函数功能:求取均值 
经常操作的参数为axis,以m * n矩阵举例:
axis 不设置值,对 m*n 个数求均值,返回一个实数
axis = 0:对各列求均值,返回 1* n 矩阵
axis =1 :对各行求均值,返回 m *1 矩阵

np.std()同理
'''
#23、 Create a custom dtype that describes a color as four unsigned bytes (RGBA)     
#创建一个定制的类型来描述颜色,用四个无符号字节
#custom:定制的,风俗,习惯
RGBA = np.dtype([("r", np.ubyte, 1),
                  ("g", np.ubyte, 1),
                  ("b", np.ubyte, 1),
                  ("a", np.ubyte, 1)])
#ubyte:无符号的字节,u:代指unsigned 
print(RGBA)
#24、Multiply a 5x3 matrix by a 3x2 matrix (real matrix product)   
matrix_8=np.random.random((5,3))
matrix_9=np.random.random((3,2))
matrix_8@matrix_9
np.dot(matrix_8,matrix_9)
#@符号和np.dot()用于实现矩阵乘法

#*和np.multiply用于实现矩阵元素一一对应相乘
#25、Given a 1D array, negate all elements which are between 3 and 8, in place         
#negate:否认,取消。  in place  到位,就位,在正确的位置
#对位于三到八之间的元素取相反数
array_3=np.random.randint(1,10,10)
array_3[(3 < array_3) & (array_3 <= 8)] *= -1
#索引允许通过关系运算取得
print(array_3)
#26、What is the output of the following script   
#下面一段脚本的输出是什么
print(sum(range(5),-1))  #1+2+3+4-1 输出9
from numpy import *
print(sum(range(5),-1)) #输出10
#该题目考查了python自带sum和numpy的np.sum的区别
#sum不能处理二维数组,只是对一维数据求和,
#np.sum则可以,其第二个参数指定按列(axis=0)
#或行(axis=1)求和,不设该参数是全部求和。
#27、 Consider an integer vector Z, which of these expressions are legal?    
#考虑一个整形向量Z,以下哪个表达是合法的
Z=np.array([1,23,3],dtype=int)
Z**Z
#合法,元素一一对应乘方,返回array([1,23**23,3**3])
2 << Z >> 2
#合法
#>> 和 <<都是位运算,对二进制数进行移位操作,
#<< 是左移,末位补0,x<<1是将x的二进制表示左移一位,相当于原数x乘2。
#>>是右移,右移1位相当于除以2。
#而>>=和<<=,就是对变量进行位运算移位之后的结果再赋值给原来的变量,类比赋值运算符+=和-=可以理解。
#注意如果看不懂结果,可以转二进制看看
# 真除法X / Y
# 截断除法X // Y(x/y并忽略小数部分);
Z <- Z 
# ->常常出现在python函数定义的函数名后面,为函数添加元数据,描述函数的返回类型
1j*Z 
#合法,整型与虚数广播相乘
Z/1/1
#合法,连除,先除1再除1
Z<Z>Z
#合法,先完成前半段比较,返回True/False,
#对应01结果,01数值结果再和后面的变量比较。
#28、What are the result of the following expressions
print(np.array(0) / np.array(0))   
#真除法,返回nan
print(np.array(0) // np.array(0))   
#截断除法,返回0
print(np.array([np.nan]).astype(int).astype(float))   
#返回[-9.22337204e+18]
#NaN(Not a Number,非数)是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值。
#29、How to round away from zero a float array ?   
#round away from zero 四舍五入
vector_x=np.random.random(10)
np.around(vector_x,2)
#四舍五入保留两位小数
#30、How to find common values between two arrays
np.intersect1d([1,2,3],[3,2,4]) 
#取两个集合的交集,intersect:交差,相交
from functools import reduce
reduce(np.intersect1d, ([1, 3, 4, 3], [3, 1, 2, 1], [6, 3, 4, 2]))
#取多个集合的交集

你可能感兴趣的