大名鼎鼎的Numpy库,其实是一个能够实现科学计算的python模组。与其他不同的是,如果要存储数据,其储存在连续的内存块中,与其他的Python内置对象相独立。
同时。它其中使用C语言的算法库可以很轻松地对内存进行相应操作,没有其他的前期工作。NumPy数组所使用的内存与其他的内置序列相比更少。
而且,其它的Python 重量级的相关套件(如:Pandas、SciPy、Scikit-learn 等等)都几乎是奠基在 Numpy 的基础上。
所以,学会 Numpy才能为往后学习其他数据科学相关套件来分析影像组学打下坚实的基础呢!
那下面我们就一起来初窥一下这个Numpy到底是何方神圣吧!小编觉得,可以用一句话来总结Numpy的特点。
要想python,先Numpy。要想Numpy,先阵列!所以从这句话中我们可以看到,Numpy中最经典的就是阵列操作。
实际上,Numpy的所有功能都是建立在同质且多维度的 ndarray(N-dimensional array)上。
ndarray 有几个关键属性,分别为维度(ndim)、形状(shape)和数值类型(dtype)。
一般我们称一维数组为 vector 而二维数组为 matrix。所以作为最开始的步骤,我们需要引入 numpy 模块,透过传入 list 到 numpy.array() 创建数组。
#引入 numpy 模块
import numpy as np
np1 = np.array([1, 2, 3])
np2 = np.array([4, 5, 6])
那如果要加起来,怎么加呢?
#阵列相加
print(np1 + np2)
#[5 7 8]
所以,我们可以通过以下操作来明确一个阵列的相关信息
#显示相关信息
print(np1.ndim, np1.shape, np1.dtype)
#1 (3,) int64 => 一维数组, 三个元素, 数据型别
相信聪明的大家到这里都没有任何问题。那么我们接下来再继续生成第三个阵列
np3 = np.array([1, 2, 3, 4, 5,6])
接下来,如果我们想要改变阵列的维度,比如从前面的一维变成二维可以这么做
np3 = np3.reshape([2, 3])
print(np3.ndim, np3.shape, np3.dtype)
#2 (2, 3) int64
大家一定注意到了吧,上面都会显示一个int64那int64又是什么东西呢?
说到这个,我们就要来讨论一下阵列的型别,或者称为数据的类型。常用的主要有以下四种bool、int、float、string。
bool也就是我们高中学过的布尔,可以包含 True、False。
int可以包含 int16、int32、int64。其中数字是指bits。
float可以包含 16、32、64 表示小数点后几位。
string可以是 string、unicode。
而有时可能会出现nan ,则表示遗失值。那接下来,我们来一个前面的汇总。
import numpy as np
a = np.arange(15).reshape(3, 5)
a
#array( [ [ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14] ] )
然后我们来逐个查看一下数据的内容。
print(a.shape)
print(a.ndim)
print(a.dtype.name)
print(a.itemsize) # bytes
print(a.size)
print(type(a))
输出的结果
(3, 5)
2
int64
8
15
大家都看明白了吧?所以我们要掌握的第一步就是创建阵列,使用 np.array() 将Python list换为 numpy array。
a = np.array([2,3,4])
print(a)
print(a.dtype)
b = np.array([1.2, 3.5, 5.1])
print(b.dtype)
输出结果
[2 3 4]
int64
float64
除了人为的添加进去阵列的内容,我们当然也可以通过函数的方式添加比如下面两个函数
np.arange()
np.linspace()
我们先来通过观察下面的结果看看两者的区别。
from numpy import pi
print(np.arange(10, 30, 5))
print(np.arange(0, 2, 0.3))
print(np.linspace(0, 2, 9))
出来的结果
[10 15 20 25]
[0. 0.3 0.6 0.9 1.2 1.5 1.8]
[0. 0.25 0.5 0.75 1. 1.25 1.5 1.75 2. ]
事实上,两者的区别就在于arange()类似于内置函数range(),通过指定开始值、终值和步长创建表示等差数列的一维数组,注意得到的结果数组不包含终值。
而linspace()通过指定开始值、终值和元素个数创建表示等差数列的一维数组,可以通过endpoint参数指定是否包含终值,默认值为True,即包含终值。这就是两者的差别。
当然有!比如:
np.random.rand()
np.random.randn()
np.fromfunction()
np.fromfile()
这几个函数,就请大家自行探索一下啦!同时阵列还能通过指定axis来查看各行各列的情况。axis=0 表示各行的总称axis=1 表示各列的总称比如
b = np.arange(12).reshape(3,4)
print(b)
print(b.sum(axis=0))
print(b.min(axis=1))
print(b.cumsum(axis=1))
结果显然为
[ [ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11] ]
[12 15 18 21]
[0 4 8]
[ [ 0 1 3 6]
[ 4 9 15 22]
[ 8 17 27 38] ]
大家要注意喔,python的行列计数是从0开始的哟!
这么多种生成阵列的方式。那有没有拆分阵列呢?
俗话说得好,分久必合,合久必分。有分就有合。这是万事万物的自然规律。所以我们再来看看如何切割以及索引阵列。
a = np.arange(10)**3
print(a)
print(a[2])
print(a[2:5])
print(a[:6:2])
print(a[::-1])
得到的结果
[ 0 1 8 27 64 125 216 343 512 729]
8
[ 8 27 64]
[ 0 8 64]
[729 512 343 216 125 64 27 8 1 0]
大家看,第一行其实是制造10个从0开始的三次方的数字。而我们print第2个数,显然是8。再接着,print第2到5个数字,得到8,27,64。所以关键的要点就在于,一定要明白,python计数是从第0个开始的喔!
再看看两个例子来实操一下
print(b[2, 3])
print(b[0:5, 1])
print(b[:, 1])
print(b[1:3, :])
可得到
23
[ 1 11 21 31 41]
[ 1 11 21 31 41]
[[10 11 12 13]
[20 21 22 23]]
def f(x, y):
return 10*x + y
b = np.fromfunction(f,(5,4),dtype=int)
print(b)
可得到
[ [ 0 1 2 3]
[10 11 12 13]
[20 21 22 23]
[30 31 32 33]
[40 41 42 43] ]
今天我们掌握了Numpy的基本知识,一期继续
如果你也对Python感兴趣的话,可以试试这套python学习资料,毕竟小编也是用这套学的
对于0基础小白入门:
如果你是零基础小白,想快速入门Python是可以考虑培训的。
一方面是学习时间相对较短,学习内容更全面更集中。
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
温馨提示:篇幅有限,已打包文件夹,获取方式在:文末
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
检查学习结果。
这份完整版的Python全套学习资料已为大家备好,朋友们如果需要可以微信扫描下方二维码添加,输入"领取资料" 可免费领取全套资料【有什么需要协作的还可以随时联系我】朋友圈也会不定时的更新最前言python知识。
了解python的前景: https://blog.csdn.net/weixin_49892805/article/details/127196159
python有什么用: https://blog.csdn.net/weixin_49892805/article/details/127214402