兼怀八十年代科技革新与人文忧思
夫当今之世,数据如潮,信息若海。Python以其语法之清朗、生态之丰茂,膺选为天下之共器,士人争相习之。然万木葱茏,必有其根;百川奔涌,必溯其源。在Python数据科学之林海中,有物焉,无所不在,隐而不显,名曰NumPy(Numerical Python)。此物乃科学计算之基,提供高维数组之形与算筹之器。窃以为,NumPy实为Python数据科学生态之砥柱——Pandas筑台其上,SciPy、Scikit-learn皆仰其鼻息,TensorFlow、PyTorch虽为后起之秀,其底层设计理念亦多借鉴遗风。
▎ndarray:严令诸元同型,常驻内存于连续之域,是以能统摄万数,运筹如飞
▎与Python原生列表相比,其速可快了数十倍乃至百倍
▎底基以C语言铸就,行向量化之算,可直唤优化后的C/Fortran法典
NumPy之核心,曰ndarray(N-dimensional array)。此数据结构与Python原生列表(list)有霄壤之别。试观下例,可得其形:
NumPy底基,C语言铸就。当其行向量化之算,可越过Python逐元之循环,直唤优化后的C/Fortran法典,故同算一术,其速可快了数十倍乃至百倍:
可由列表、元组等旧器转化,犹如点石成金:np.array([1, 2, 3])
亦可从元组转化:np.array((4, 5, 6))
全零之阵:np.zeros((3, 4))
全一之阵:np.ones((2, 3))
单位矩阵:np.eye(4)
等差序列:np.arange(0, 10, 2) → [0, 2, 4, 6, 8]
等分序列:np.linspace(0, 1, 5) → [0., 0.25, 0.5, 0.75, 1.]
可操全阵如操一物,无须显式循环。如a + b、a * b、a + 10等,皆可直接作用于整个数组,此乃“不战而屈人之兵”在计算之再现。
可使异形之阵共舞同欢。NumPy自动将小阵扩至大阵之形。如矩阵加向量:matrix + vector,Matrix为3x3,Vector为3,结果仍为3x3,此中玄机,令人拍案。
布尔索引如以矢问,择其大于三者而取之:arr[arr > 3] → [4 5 6]。花式索引则以整数组为钥,开复杂之门:arr[[0, 2], :]。
图像者,三维之阵也;信号者,一维之列也;机器学习预处理者,标准化、分割之工也。NumPy遍及其中,凡数据处理之处,皆有NumPy之影。然吾辈当思:八十年代之初,前辈以算盘、以笔纸,呕心沥血,方得有限之数据与结论,然其探索精神,何等可敬!
人文忧思
今虽有NumPy等神器,百倍其算,然若心无敬畏,唯快是图,则技术愈进,人文愈退。故每一次运算之后,当向茫茫数据之海,寄以一丝怀旧之念。
向量化以代循环:此乃第一要义,摒弃Python逐元之循环,直唤底层优化之算
in-place操作以省内存:如np.add(x, y, out=x),避免创建新数组
择数据类型以减开销:如使用np.float32而非默认的np.float64
用视图而非副本以奉行节约:切片返回视图,避免不必要的内存复制
NumPy 2.0已出,性能更进,新硬件之支持更广。然算法日益强大,计算日益泛化,人类之思考与创造力何在?
吾辈学习NumPy,不惟得其技,更要得其道;不为炫技于一时,而为求索于永恒。
故曰:NumPy,乃Python数据科学生态之基石,八十年代之青春热血可喻其探索精神,古典雅致之文辞可状其严谨法度,忧郁怀旧之情调可衬其背后之人文忧思。望后来者,握此利器时,常怀反思之心,勿忘科技之本,在于为人。如此,则数据科学之路,方为坦途;人类智慧之光,方能永续。