python标准库array能保存数组类型数据,然而这个类型不支持多维数据,处理函数也不够丰富,至此,numpy已经成为了科学计算事实上的标准库。
numpy库处理的最基本数据类型是由同种元素构成的多维数组(ndarray),简称“数组”。数组中所有元素的种类必须相同,元素可索引,序号从0开始。ndarray类型的维度(dimensions)叫做轴(axis),轴的个数叫做秩(rank)。一维数组的秩是1,二维数组的秩是2.
2.3.1 numpy数组
创建数组:
使用python列表
numpy函数
可以直接使用python列表来创建数组。
a = np.array([1,2,3,4])
b = np.array([[1,2], [3,4], [5,6]])
查看array的属性,即维度和类型:
b.ndim 2 #二维数值
b.shape (3,2) #3行2列
b.dtype dtype('int32') #查看数组里元素的数据类型
使用numpy函数来创建数组;
arange();linspace();ones()/zeros()/full();eye()
c = np.arange(10)
d = np.linspace(0, 2, 11) #[0,2]分成11等分
np.ones((3, 3)) #参数是元组,返回3行3列的数组,数组用1填充
np.zeros(('shape')) #根据shape返回用0填充的数组
np.full((shape), number)) #用所给数字填充所给shape的数组
np.eye(4) #生成对角矩阵
np.random.randn(6, 4) #创建 6 × 4的随机数组
rand&randn:
rand是按照给定shape,填入[0,1]之间均匀分布的随机样本
randn是按照给定shape,填入符合标准正态的随机数组
访问数组和矩阵元素
索引、分片
矩阵也可以索引:
这里先生成一个6行6列的矩阵,利用了广播的方法
np.arange(start, end[, step]):和python的range函数很像
列向量会自动转换为行向量形式
当然也可以通过布尔值索引:
实质是根据a%2 == 0,生成对应的布尔值,然后返回true的值的数组
注意!!!
大部分情况下,numpy是共享内存的,独立保存要进行显示备份。可以通过np.may_share_memory()函数判断两个数组是否共享内存:
显示备份用.copy()
np.may_share_memory(a,b) >>>False
举例:埃拉托斯特尼筛选法打印[0,100]质数
要得到自然数 n 以内的全部质数,必须把不大于sqrt(n)的所有质数的倍数剔除,剩下的就是素数;
下面这个动图展示了这个算法的原理,从2开始,以2为步长,每跳经过的数字都不是质数;接着从3开始,然后5,7;到7为止;
代码:
首先建立一个100个元素的数组,用来标记是否为质数;
is_prime[0] = False #吧1去掉
for i in range(2, n_max): #从2开始检索
if i in a[is_priem] :
is_prime[(i**2 - 1)::i] = False #减一是修正从0开始检索的问题,i=2,就从3:100,将跳过的数字全标记为false,依此检索;余下的即为1:100之间的质数了。