Numpy简介及基本操作

Numpy简介及基本操作

Numpy 高效的运算工具
Numpy的优势
ndarray属性
基本操作
    ndarray.方法()	
    numpy.函数名()
ndarray运算
    逻辑运算
    统计运算
    数组间运算
合并、分割、IO操作、数据处理

3.1 Numpy优势

3.1.1 Numpy介绍 - 数值计算库

num - numerical 数值化的
py - python
ndarray
    n - 任意个
    d - dimension 维度
    array - 数组

3.1.2 ndarray介绍

3.1.3 ndarray与Python原生list运算效率对比

import random
import time
# 生成一个大原生数组
python_list = []

for i in range(100000000):
    python_list.append(random.random())

# 生成ndarray数组
ndarray_list = np.array(python_list)
# len(ndarray_list) --100000000

# 原生pythonlist求和
t1 = time.time()
a = sum(python_list)
t2 = time.time()
d1 = t2 - t1

# ndarray求和
t3 = time.time()
b = np.sum(ndarray_list)
t4 = time.time()
d2 = t4 - t3

print(d1) # 0.7309620380401611

print(d2) # 0.12980318069458008

3.1.4 ndarray的优势

1)存储风格
    ndarray - 相同类型 - 通用性不强
    list - 不同类型 - 通用性很强
2)并行化运算
    ndarray支持向量化运算
3)底层语言
    C语言,解除了GIL

3.2 认识N维数组-ndarray属性

3.2.1 ndarray的属性

shape
    ndim
    size
dtype
    itemsize
在创建ndarray的时候,如果没有指定类型
默认
    整数 int64
    浮点数 float64

3.2.2 ndarray的形状

a = np.array([[1,2,3],[4,5,6]])
b = np.array([1,2,3,4])
c = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
a # (2, 3)
array([[1, 2, 3],
       [4, 5, 6]])
b # (4,)
array([1, 2, 3, 4])
c # (2, 2, 3)
array([[[1, 2, 3],
       [4, 5, 6]],
      [[1, 2, 3],
       [4, 5, 6]]])

练习:

   [[1, 2, 3, 4],
    [1, 2, 3, 4],
    [1, 2, 3, 4]] 
    
   [[[1, 2, 3, 4],
     [1, 2, 3, 4],
     [1, 2, 3, 4]],

3.2.3 ndarray的类型

3.3 基本操作

adarray.方法()
np.函数名()
    np.array()

3.3.1 生成数组的方法

   1)生成0和1
       np.zeros(shape)
       np.ones(shape)
   2)从现有数组中生成
       np.array() np.copy() 深拷贝
       np.asarray() 浅拷贝
   3)生成固定范围的数组
       np.linspace(0, 10, 100)
           [0, 10] 等距离

       np.arange(a, b, c)
           range(a, b, c)
               [a, b) c是步长
   4)生成随机数组
       分布状况 - 直方图
       1)均匀分布
           每组的可能性相等
       2)正态分布
           σ 幅度、波动程度、集中程度、稳定性、离散程度

案例:随机生成8只股票2周的交易日涨幅数据

stock_change = np.random.normal(loc=0, scale=1, size=(8, 10))

3.3.2 数组的索引、切片

3.3.3 形状修改

   ndarray.reshape(shape) 返回新的ndarray,原始数据没有改变
   ndarray.resize(shape) 没有返回值,对原始的ndarray进行了修改
   ndarray.T 转置 行变成列,列变成行

3.3.4 类型修改

   ndarray.astype(type)
   ndarray序列化到本地
   ndarray.tostring()

3.3.5 数组的去重

   np.unique(temp)
   set(temp.flatten())
   set(temp) # 报错

3.4 ndarray运算

逻辑运算
   布尔索引
   通用判断函数
       np.all(布尔值)
           只要有一个False就返回False,只有全是True才返回True
       np.any()
           只要有一个True就返回True,只有全是False才返回False
   np.where(三元运算符)
       np.where(布尔值, True的位置的值, False的位置的值)
统计运算
   统计指标函数
       min, max, mean, median, var, std
       np.函数名
       ndarray.方法名
   返回最大值、最小值所在位置
       np.argmax(temp, axis=)
       np.argmin(temp, axis=)

3.5 数组间运算

3.5.1 场景

3.5.2 数组与数的运算

arr = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
arr / 10
array([[0.1, 0.2, 0.3, 0.2, 0.1, 0.4],
       [0.5, 0.6, 0.1, 0.2, 0.3, 0.1]])

3.5.3 数组与数组的运算

满足广播机制 

3.5.4 广播机制

eg:不满足广播机制

arr1 = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
arr2 = np.array([[1, 2, 3, 4], [3, 4, 5, 6]])
print(arr1.shape) # (2, 6)
print(arr2.shape) # (2, 4)
# print(arr1 + arr2) 报错

eg:满足广播机制

arr1 = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
arr2 = np.array([[1], [3]])
print(arr1.shape) # (2, 6)
print(arr2.shape) # (2, 1)
arr1 + arr2
array([[2, 3, 4, 3, 2, 5],
       [8, 9, 4, 5, 6, 4]])

3.5.5 矩阵运算

1 什么是矩阵
    矩阵matrix 二维数组
    矩阵 & 二维数组
    两种方法存储矩阵
        1)ndarray 二维数组
            矩阵乘法:
                np.matmul
                np.dot
        2)matrix数据结构
2 矩阵乘法运算
    形状
        (m, n) * (n, l) = (m, l)
    运算规则
        A (2, 3) B(3, 2)
        A * B = (2, 2)

3.6 合并、分割

3.6.1 合并

a = stock_change[:2, 0:4]
b = stock_change[4:6, 0:4]
a
array([[ 1.1       , -0.45576704,  0.29667843,  0.16606916],
       [ 0.36775845,  0.24078108,  0.122042  ,  1.1       ]])
a.shape
(2, 4)
a.reshape((-1, 2))
array([[ 1.1       , -0.45576704],
       [ 0.29667843,  0.16606916],
       [ 0.36775845,  0.24078108],
       [ 0.122042  ,  1.1       ]])
b
array([[-0.9822216 , -1.09482936, -0.81834523,  1.1       ],
       [ 0.41739964, -0.26826893, -0.70003442, -0.58593912]])
# 横向合并,两种操作等价
np.hstack((a, b))

np.concatenate((a, b), axis=1)
array([[ 1.1       , -0.45576704,  0.29667843,  0.16606916, -0.9822216 ,
        -1.09482936, -0.81834523,  1.1       ],
       [ 0.36775845,  0.24078108,  0.122042  ,  1.1       ,  0.41739964,
        -0.26826893, -0.70003442, -0.58593912]])
# 纵向合并,两种操作等价
np.vstack((a, b))

np.concatenate((a, b), axis=0)
array([[ 1.1       , -0.45576704,  0.29667843,  0.16606916],
       [ 0.36775845,  0.24078108,  0.122042  ,  1.1       ],
       [-0.9822216 , -1.09482936, -0.81834523,  1.1       ],
       [ 0.41739964, -0.26826893, -0.70003442, -0.58593912]])

3.7 IO操作与数据处理

3.7.1 Numpy读取

只能读取相同类型的,读不出来为nan
data = np.genfromtxt("test.csv", delimiter=",")
data 
array([[  nan,   nan,   nan,   nan],
       [  1. , 123. ,   1.4,  23. ],
       [  2. , 110. ,   nan,  18. ],
       [  3. ,   nan,   2.1,  19. ]])

3.7.2 如何处理缺失值

两种思路:
    直接删除含有缺失值的样本
    替换/插补
        按列求平均,用平均值进行填补
eg:用平均值填充

def fill_nan_by_column_mean(t):
    for i in range(t.shape[1]):
        # 计算nan的个数
        nan_num = np.count_nonzero(t[:, i][t[:, i] != t[:, i]])
        if nan_num > 0:
            now_col = t[:, i]
            # 求和
            now_col_not_nan = now_col[np.isnan(now_col) == False].sum()
            # 和/个数
            now_col_mean = now_col_not_nan / (t.shape[0] - nan_num)
            # 赋值给now_col
            now_col[np.isnan(now_col)] = now_col_mean
            # 赋值给t,即更新t的当前列
            t[:, i] = now_col
    return t

fill_nan_by_column_mean(data)
array([[  2.  , 116.5 ,   1.75,  20.  ],
       [  1.  , 123.  ,   1.4 ,  23.  ],
       [  2.  , 110.  ,   1.75,  18.  ],
       [  3.  , 116.5 ,   2.1 ,  19.  ]])

你可能感兴趣的:(numpy,python)