哈咯大家好!高高低低,算法分析(单押!)
大名鼎鼎的Numpy库,其实是一个能够实现科学计算的python模组。与其他不同的是,如果要存储数据,其储存在连续的内存块中,与其他的Python内置对象相独立。
同时。它其中使用C语言的算法库可以很轻松地对内存进行相应操作,没有其他的前期工作。NumPy数组所使用的内存与其他的内置序列相比更少。
而且,其它的Python 重量级的相关套件(如:Pandas、SciPy、Scikit-learn 等等)都几乎是奠基在 Numpy 的基础上。
所以,学会 Numpy才能为往后学习其他数据科学相关套件来分析影像组学打下坚实的基础呢!
别别别,不敢把大家绕弯。低低因为才疏学浅,还请感兴趣的捧油们移步前两年Numpy团队在Nature上发表的关于Numpy的新版介绍概述(doi: 10.1038/s41586-020-2649-2)。
(图片源自于Harris CR, Array programming with NumPy. Nature. 2020Sep;585(7825):357-362. )
(低低:(ˉ▽ˉ;)… 好吧 低低答应大家下次一定做一个单独的专题介绍这篇超高分综述!)
那下面我们就一起来初窥一下这个Numpy到底是何方神圣吧!
(画外音:(抢答)要想影像组学,先python!)
要想python,先Numpy。要想Numpy,先阵列!
所以从这句话中我们可以看到,Numpy中最经典的就是阵列操作。
(低低:所以可以说,如果你会阵列操作,基本上你就可以掌握Numpy啦!)
(画外音:哇,感觉比R的要好看很多耶( •̀ ω •́ )y)
实际上,Numpy的所有功能都是建立在同质且多维度的 ndarray(N-dimensional array)上。
(低低:也就是类似电影《盗梦空间》里面的那样啦!)
ndarray 有几个关键属性,分别为维度(ndim)、形状(shape)和数值类型(dtype)。一般我们称一维数组为 vector 而二维数组为 matrix。
所以作为最开始的步骤,我们需要引入 numpy 模块,透过传入 list 到 numpy.array() 创建数组。
np1 = np.array([1, 2, 3])
np2 = np.array([4, 5, 6])
所以,我们可以通过以下操作来明确一个阵列的相关信息
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)
说到这个,我们就要来讨论一下阵列的型别,或者称为数据的类型。
常用的主要有以下四种bool、int、float、string。
bool
也就是我们高中学过的布尔,可以包含 True、False。
int
可以包含 int16、int32、int64。其中数字是指 bits
。
float
可以包含 16、32、64 表示小数点后几位。
string
可以是 string、unicode。
a = np.arange(15).reshape(3, 5)
# array( [ [ 0, 1, 2, 3, 4],
print(a.itemsize) # bytes
所以我们要掌握的第一步就是创建阵列,使用 np.array() 将Python list换为 numpy array。
b = np.array([1.2, 3.5, 5.1])
除了人为的添加进去阵列的内容,我们当然也可以通过函数的方式添加
print(np.arange(10, 30, 5))
print(np.arange(0, 2, 0.3))
print(np.linspace(0, 2, 9))
[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,即包含终值。
同时阵列还能通过指定axis来查看各行各列的情况。
b = np.arange(12).reshape(3,4)
大家要注意喔,python的行列计数是从0开始的哟!
(画外音:哇,这么多种生成阵列的方式。那有没有拆分阵列呢?)
俗话说得好,分久必合,合久必分。有分就有合。这是万事万物的自然规律。
[ 0 1 8 27 64 125 216 343 512 729]
[729 512 343 216 125 64 27 8 1 0]
大家看,第一行其实是制造10个从0开始的三次方的数字。
而我们print第2个数,显然是8。再接着,print第2到5个数字,得到8,27,64。
所以关键的要点就在于,一定要明白,python计数是从第0个开始的喔!
b = np.fromfunction(f,(5,4),dtype=int)
(画外音:感觉这个阵列真的很有趣,比R有意思多啦!)
既然今天掌握了Numpy的基本知识,那我们下一期就继续来看看Numpy运用在影像组学上有什么技巧吧!
515500独门绝技!打通python的第一道大关,你也可以!
文章评论