认真是我们
参与这个社会的方式

Numpy基础

入门可以参考https://morvanzhou.github.io/tutorials/data-manipulation/np-pd/

先占个坑

20180920开始填坑


Numpy:提供了一个在Python中做科学计算的基础库,重在数值计算,主要用于多维数组(矩阵)处理的库。用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多。本身是由C语言开发,是个很基础的扩展,Python其余的科学计算扩展大部分都是以此为基础。

  • 高性能科学计算和数据分析的基础包
  • ndarray,多维数组(矩阵),具有矢量运算能力,快速、节省空间
  • 矩阵运算,无需循环,可完成类似Matlab中的矢量运算
  • 线性代数、随机数生成
  • import numpy as np

ndarray 多维数组(N Dimension Array)

NumPy数组是一个多维的数组对象(矩阵),称为ndarray,具有矢量算术运算能力和复杂的广播能力,并具有执行速度快和节省空间的特点。

ndarray拥有的属性

  1. ndim属性:维度个数
  2. shape属性:维度大小
  3. dtype属性:数据类型

维度

来源:https://blog.csdn.net/Exziro/article/details/78152621

在数学上我们说维度是什么呢?–在一定的前提下描述一个数学对象所需的参数个数。但是我们今天所谈到的维度却和这里数学所说的维度有着一些区别。有标题可知,我们今天所要说的维度是基于numpy中的多维数组。numpy最重要的一个特点就是其N维数组对象,该对象是一个大的灵活的大数据集容器。以此利用数组来对我们获取到的整块的数据执行一些数学上的运算。绕了一圈,维度又是啥,我们先来看一下以下的代码。

> data = np.array([[1,2],[4,5]])
> data.shape()
(2L, 2L)
> data1 = np.array([[1,2,3],[4,5,6],[7,8,9]])
> data1.shape
(3L, 3L)

 

对人来说高维空间是很难想象的,但是我们可以从纯数学的角度来看。对多维数组来说,确定最底层的一个基本元素位置需要用到的索引个数即是维度。用上面的数组data来举一个简单的例子。当我们要获取 1 的值,我们需要使用 a[0][0], 一共用到了两个坐标索引,所以这个数组的维度是2维。

直观的说数组的维度就是所有基本元素左边 [ 个数的最大值。而每个坐标索引可取的值是有范围的,比如这里两个索引都只能取 0 和 1。维度与坐标值范围就组成了多维数组的 shape 属性,它是一个元组,长度代表了维度,而元组的每一个值代表了一个坐标索引可取的值个数,所以将 shape 的所有值乘起来就可以算出多维数组元素的个数。就如举例中的两个例子一个是2*2的数组,而另一个是一个3*3的数组。

轴这个概念可以说是我第一次看到这个概念,在学习线性代数的时候,貌似也没有听过(大雾)。理解numpy中的轴的概念对我们接下来理解numpy中的转置transpose有着至关重要的作用。

如果我们直接说轴这个概念,童鞋们可能会比较迷茫,我们先来说一个和它非常相似的概念—坐标轴。n 维空间里有 n 个坐标轴,并且坐标轴互相垂直,每一个点相对于一条坐标轴都有唯一的一个坐标值。对同一条坐标轴来说,坐标值相同的点在同一个 n-1 维的“平面”上。任意取一个“平面”,我们就能定义“同一个坐标轴上的点”,这些点在“平面”上的投影相同,同一个坐标轴上的点组成的线是与坐标轴平行的。而所谓的延轴计算实际上是降维的过程,同一个坐标轴上的点合并成一个点,这样n维空间就变成了 n-1 维空间。例子

>> data2
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
>> data2.shape
(2L, 3L, 4L)

 

这里会常常提到这样的一个例子,这个数组我们该如何称呼它呢?2行3列4个平面。这其实就和我们上面所描述的坐标轴的概念十分的接近。如果你喜欢这样的说法也是可以的。

看完了坐标轴,下面我们来说说轴,如果还是有些问题的童鞋可以参考一下下面的理解。要理解它,我们可以先使用一下它,并且观察一下它是如何进行操作的。我们用最简单的累加来进行一下操作。代码如下

data2.sum(axis=0)
Out[49]: 
array([[12, 14, 16, 18],
       [20, 22, 24, 26],
       [28, 30, 32, 34]])

data2
Out[50]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

data2.sum(axis=1)
Out[51]: 
array([[12, 15, 18, 21],
       [48, 51, 54, 57]])

data2.sum(axis=2)
Out[52]: 
array([[ 6, 22, 38],
       [54, 70, 86]])

 

红线框代表的是以轴为0相加的情况,而黄线则是轴为1,蓝线自不必多说就是轴为2的情况。

具体到 numpy 中的多维数组来说,轴即是元素坐标的索引。比如,第0轴即是第1个索引,延0轴计算就是去掉坐标中的第一个索引。过程就是

  1. 遍历其他索引的所有可能组合
  2. 取出一个组合,保持值不变,遍历第一个索引所有可能值
  3. 根据索引可以获得了同一个轴上的所有元素
  4. 对他们进行计算得到最后的元素
  5. 所有组合的最后结果组到一起就是最后的 n-1 维数组,所以如果一个多维数组的 shape 是 (a1, a2, a3, a4), 那么延轴0计算最后的数组shape 是 (a2, a3, a4), 延轴1计算最后的数组shape是 (a1, a3, a4)。

网上找到了两张图,比较直观

平时处理的都是二维的数据,所以大多数场景下使用的时死记硬背。把axis=1记作行,把axis=0记作列。(在pandas中,针对二维数据可以将axis=1写成axis=’columns’,将axis=0写成axis=’rows’)

另外一种比较好理解的记忆方式是将轴数记忆为中括号的嵌套深度,最外层的为0,每增加一层加1

Shape元组对应的下标及为“轴”。shape 中的各个数就是对应 axis 的元素个数。

ndarray的矩阵运算

 

ndarray的维数转换

最后我们来说一下numpy的transpose这个参数。这个参数是我们在基于理解了轴,维度等情况下对多维数组进行的一个重要的操作,不过这个理解起来倒确实有些令人头疼。
首先我们对矩阵的维度进行编号,上述矩阵有三个维度(假设),则编号分别为0,1,2,而transpose函数的参数输入就是基于这个编号的,如果我们调用transpose(0,1,2),那么矩阵将不发生变化,如果我们不输入参数,直接调用transpose(),其效果就是将矩阵进行转置,起作用等价与transpose(2,1,0)。

arr3d = np.random.rand(2,3,4) # 2x3x4 数组,2对应0,3对应1,4对应3
print(arr3d)
print(arr3d.transpose((1,0,2))) # 根据维度编号,转为为 3x2x4 数组

 

没有故事 也没有酒

点也没用点也没用