数据分析之二:用NumPy进行数据处理

1. NumPy简介


  • NumPy是Numerical Python的简称,用作高性能计算和数据分析,其操作是围绕ndarray这么一个矩阵元素来进行。

  • 针对数据分析的应用,NumPy主要功能体现在如下几个方面:

  1. 用于数据清理和整理、子集构造和过滤、转换等快速的矢量化数组运算
  2. 常用的数组算法,如排序、唯一化、集合运算等
  3. 统计和数据聚合运算
  4. 异构数据的合并/连接/转换

2. 使用NumPy进行数据处理


  • 函数库的导入,以下简写成np
import numpy as np

2.1 矩阵的创建


In [1]: arr = np.array([[1,2,3]])
In [2]: arr
Out[2]: array([[1, 2, 3]])

也可以像下面这样批量生成

In [3]: arr = np.array([[1,2,3]]).repeat(4, axis=0)
In [4]: arr
Out[4]: 
array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])
  • 或者我想初始化一个空的矩阵,只需要提供行和列即可,例如想创建3×4的矩阵,用empty或者zeros函数
In [6]: arr = np.empty((3,4))
In [7]: arr
Out[7]: 
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])
  • 查看矩阵的维度,行列数以及元素的数据类型
In [10]: arr = np.array([[1,2,3],[4,5,6]])
In [11]: arr
Out[11]: 
array([[1, 2, 3],
       [4, 5, 6]])

In [12]: arr.ndim
Out[12]: 2

In [13]: arr.shape
Out[13]: (2, 3)

In [14]: arr.dtype
Out[14]: dtype('int64')
  • 这里需要理清一个“轴”的概念
    轴(axis)和矩阵空间的维度相关,举个例子,在平面坐标系中,x轴与y轴构成二维的平面,由此,x,y,z三个轴组成三维立体空间;

  • 再来看矩阵,如果矩阵是二维的,那么它由2个轴组成,np将它们表示成0轴和1轴,0轴修饰“列方向”,1轴修饰“行方向”,0轴的长度为列向量长度,1轴的长度为行向量长度,那么以上arr = np.array([[1,2,3]]).repeat(4, axis=0)可以理解成将向量[1,2,3]在列方向上重复多次,生成了4×3矩阵,可以试验一下axis=1的情况,答案是仍然生成一个一维的行向量,因为它是按照行方向延伸的;

  • 推广到三维,不难发现,三维空间可以看做由多个二维平面层叠生成的,则三维空间的0轴修饰“平面”,1轴修饰平面的“列”,2轴修饰平面的“行”。

  • 注:矩阵的创建函数:

array         # 将输入数据转换为ndarray,可以指定dtype
asarray       # 将输入转换为ndarray
arange        # 类似于Python的range函数,可以指定范围和步长
ones          # 初始化为一个全1的数组
zeros         # 初始化为一个全0的数组
empty         #只分配内存空间,但不进行初始化
eye/identity  # 创建方阵,对角线为全1,其余为0

2.1 数据存取


支持Python的下标和切片访问,但是np可以给切片直接赋值,并且切片赋值会影响到原始数组,这是因为切片操作不会对数据进行复制,数据只在内存保留一份,对切片的赋值也就是更改原始内存,如果想在切片上重新分配一块内存区域,可以使用ndarray.copy()函数。

In [22]: arr = np.arange(10)
In [23]: arr
Out[23]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [24]: arr[5]
Out[24]: 5

In [25]: arr[5:8]
Out[25]: array([5, 6, 7])

In [26]: arr[5:8] = 10

In [27]: arr
Out[27]: array([ 0,  1,  2,  3,  4, 10, 10, 10,  8,  9])

2.3 矩阵运算


  • 变换
In [28]: arr = np.arange(15).reshape((3,5))

In [29]: arr
Out[29]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

# 转置操作
In [30]: arr.T                     
Out[30]: 
array([[ 0,  5, 10],
       [ 1,  6, 11],
       [ 2,  7, 12],
       [ 3,  8, 13],
       [ 4,  9, 14]])

# 矩阵乘法
In [31]: np.dot(arr, arr.T)
Out[31]: 
array([[ 30,  80, 130],
       [ 80, 255, 430],
       [130, 430, 730]])
  • 排序
In [40]: arr = randn(8)

In [41]: arr
Out[41]: 
array([-0.04165555, -0.58147668, -0.1026614 , -2.00641289, -0.94810499,
        0.68015849, -0.94358531, -0.12948516])

In [42]: arr.sort()

In [43]: arr
Out[43]: 
array([-2.00641289, -0.94810499, -0.94358531, -0.58147668, -0.12948516,
       -0.1026614 , -0.04165555,  0.68015849])

In [44]: arr = randn(3,4)

In [45]: arr
Out[45]: 
array([[-0.31807417, -0.12209285, -0.35218604,  1.86467014],
       [-0.87586945,  0.48491914,  0.02919893, -0.89746354],
       [ 0.75919047,  0.61933593,  0.22276992, -0.63860342]])

# 沿1轴方向上的排序(行方向,也是sort默认方向)
In [46]: arr.sort(axis=1)

In [47]: arr
Out[47]: 
array([[-0.35218604, -0.31807417, -0.12209285,  1.86467014],
       [-0.89746354, -0.87586945,  0.02919893,  0.48491914],
       [-0.63860342,  0.22276992,  0.61933593,  0.75919047]])
  • 统计
# 创建一个三维矩阵
In [15]: arr = np.random.randint(0,9,[2,3,3])
In [16]: arr
Out[16]: 
array([[[7, 0, 4],
        [3, 1, 7],
        [3, 8, 1]],

       [[2, 3, 5],
        [0, 3, 4],
        [2, 6, 7]]])

# 0轴上相加,也就是平面相加,结果仍然是一个平面
In [17]: arr.sum(axis=0)
Out[17]: 
array([[ 9,  3,  9],
       [ 3,  4, 11],
       [ 5, 14,  8]])

# 1轴上相加,也就是各平面上沿着列方向相加
In [18]: arr.sum(axis=1)
Out[18]: 
array([[13,  9, 12],
       [ 4, 12, 16]])

# 2轴上相加,也就是各平面上沿着行方向相加
In [19]: arr.sum(axis=2)
Out[19]: 
array([[11, 11, 12],
       [10,  7, 15]])

注:数学统计函数:

sum
mean
std/var             # 标准差/方差
min/max
argmin/argmax       #  最小和最大元素的下标索引

你可能感兴趣的:(数据分析之二:用NumPy进行数据处理)