Numpy入门(简单)

NumPy介绍

最近因为需要使用python做一个数据处理的项目,所以粗略的学习了一下numpy,在此分享一下自己学习中遇到的一些问题和一些基础的名词。

什么是NumPy?

python用于科学计算的基础包。提供多维数组对象,各类派生对象,用于数组快速操作的api。

NumPy包的核心是ndarray对象。封装了python原生的同数据类型的n维数组(为了保证运行速度,其中许多操作都是代码在本地进行编译后执行的)

与原生Python Array的区别

  1. NumPy数组在创建的时候就又固定的大小。更改ndarray的大小会创建一个新的数组并且删除原有数组。
  2. NumPy数组中的元素需要具有相同的数据类型,因此在内存中的大小相同。
  3. NumPy数组有利于对大量数据进行高级数学和其他类型的操作。(这些操作相比原生执行效率更高,代码更少)
  4. NumPy为计算速度(不牺牲使用python写代码的好处前提下)提出的的解决方案:当涉及到ndarray的时候,逐个元素的操作是"默认模式",但逐个元素的操作由预编译的c代码快速执行。NumPy的大部分功能的基础:矢量化和广播

为什么NumPy这么快?

  • 矢量化代码更简洁,更易于阅读
  • 更多的代码行通常意味着更少的错误
  • 代码更接近标准的数学符号(通常,更容易正确编码数学结构)
  • 矢量化导致产生更多"Pythonic"代码。如果没有矢量化,我们的代码就会被低效且难以阅读的for循环所困扰。

问题:向量化是什么?

答案:“向量化”(完全抽象出循环并仅描述对数组而不是元素的操作)是重写循环的过程,以便与其同时处理(例如)数组的4个元素N / 4次,而不是处理数组的单个元素N次。其本质其实很简单,就是同时进行多个计算,例子如下:

补充知识:许多CPU具有“向量”或“ SIMD”指令集,这些指令集将相同的操作同时应用于两个,四个或更多数据。(实现向量化的基础)

for (int i=0; i<16; ++i)
    C[i] = A[i] + B[i];
//展开此循环会将其转换为如下形式:
for (int i=0; i<16; i+=4) {
    C[i] = A[i] + B[i];
    C[i+1] = A[i+1] + B[i+1];
    C[i+2] = A[i+2] + B[i+2];
    C[i+3] = A[i+3] + B[i+3];
}
//另一方面,将其向量化会产生如下结果:
for (int i=0; i<16; i+=4)
    addFourThingsAtOnceAndStoreResult(&C[i], &A[i], &B[i]);

问题:广播是什么?

答案:当两个数组的形状并不相同的时候,我们可以通过扩展数组的方法来实现相加、相减、相乘等操作,这种机制叫做广播(broadcasting)。

例子:
不同维度

同维度

posted @ 2020-04-20 09:21  FoolShao  阅读(129)  评论(0)    收藏  举报