Numpy_04 数组运算

数组间运算

学习目标

  • 目标

    • 说明数组间运算的广播机制
    • 知道数组与数之间的运算
    • 知道数组与数组之间的运算
    • 理解矩阵的特点以及运算规则
    • 应用np.matmul实现矩阵运算
  • 应用

    • 学生综合成绩矩阵运算

一、场景

在这里插入图片描述
数据:

[[80,86],
[82,80],
[85,78],
[90,90],
[86,82],
[82,90],
[78,80],
[92,94]]

二、数组与数的运算

import numpy as np
 
arr = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
print(arr + 1)
"""
[[2 3 4 3 2 5]
 [6 7 2 3 4 2]]
"""
print(arr / 2)
"""
[[0.5 1.  1.5 1.  0.5 2. ]
 [2.5 3.  0.5 1.  1.5 0.5]]
"""
 
# 可以对比python列表的运算,看出区别
a = [1, 2, 3, 4, 5]
print(a * 2)
# [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
 

三、数组与数组的运算

用到的比较少

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]])

上面这个能进行运算吗,结果是不行的!

四、广播机制

执行 broadcast 的前提在于,两个 ndarray 执行的是 element-wise的运算,而不是矩阵乘法的运算,矩阵乘法运算时需要维度之间严格匹配。Broadcast机制的功能是为了方便不同形状的array(numpy库的核心数据结构)进行数学运算

当操作两个数组时,numpy会逐个比较它们的shape(构成的元组tuple),只有在下述情况下,两个数组才能够进行数组与数组

  • 维度相等
  • shape(其中相对应的一个地方为1)

例如:

Image (3d array):  256 x 256 x 3
Scale (1d array):              3
Result (3d array): 256 x 256 x 3
 
A      (4d array):  9 x 1 x 7 x 1
B      (3d array):      8 x 1 x 5
Result (4d array):  9 x 8 x 7 x 5
 
A      (2d array):  5 x 4
B      (1d array):      1
Result (2d array):  5 x 4
 
A      (2d array):  15 x 3 x 5
B      (1d array):  15 x 1 x 1
Result (2d array):  15 x 3 x 5

如果是下面这样,则不匹配:

A  (1d array): 10 x 2
B  (1d array): 12
A  (2d array):      2 x 1
B  (3d array):  8 x 4 x 3

这样就可以运算了:

In [16]: arr1 = np.array([[1,2,3,2,1,4], [5,6,1,2,3,1]])
    ...: arr2 = np.array([[1], [3]])
 
In [17]: arr1 * arr2
Out[17]: 
array([[ 1,  2,  3,  2,  1,  4],
       [15, 18,  3,  6,  9,  3]])

五、矩阵运算

机器学习用到的比较多
现在再次回到上面的学生问题?
在这里插入图片描述
如何能够达到我们想要的效果,直接得出每个学生的成绩!!!!这是机器学习最常见的问题之一,如何进行数据运算

5.1、什么是矩阵

矩阵,英文matrix,和array的区别矩阵必须是2维的,但是array可以是多维的。

  • np.mat()
    • 将数组转换成矩阵类型(不论是几维都会转换为二维)
In [21]: a = np.array([[80, 86], [82, 80], [85, 78], [90, 90], [86, 82], [82, 90], [78, 80], [92, 94]])
    ...: np.mat(a)
Out[21]: 
matrix([[80, 86],
        [82, 80],
        [85, 78],
        [90, 90],
        [86, 82],
        [82, 90],
        [78, 80],
        [92, 94]])

5.2、矩阵乘法运算

在这里插入图片描述
必须符合上面的式子,否则运算出错.

在进行矩阵运算的时候,可以直接使用一个乘法运算API

  • mp.matmul
a = np.array([[80, 86],
              [82, 80],
              [85, 78],
              [90, 90],
              [86, 82],
              [82, 90],
              [78, 80],
              [92, 94]])
b = np.array([[0.7], [0.3]])
 
c = np.matmul(a, b)
print(c)
"""
[[81.8]
 [81.4]
 [82.9]
 [90. ]
 [84.8]
 [84.4]
 [78.6]
 [92.6]]
"""
5.3、矩阵应用场景

大部分机器学习算法需要用到


合并、分割

学习目标

  • 目标
    • 应用concatenate、vstack、hstack实现数组合并
    • 应用split实现数组的横、纵向分割
  • 应用

一、合并、分割的用处

实现数据的切分和合并,将数据进行切分合并处理

二、合并

  • numpy.concatenate((a1, a2, …), axis=0)
  • numpy.hstack(tup) Stack arrays in sequence horizontally (column wise).
  • numpy.vstack(tup) Stack arrays in sequence vertically (row wise).

比如我们将两部分股票的数据拼接在一起:

a = stock_day_rise[:2, 0:4]
b = stock_day_rise[10:12, 0:4]

# axis=1时候,按照数组的列方向拼接在一起
# axis=0时候,按照数组的行方向拼接在一起
np.concatenate([a, b], axis=0)

array([[-2.59680892, -2.44345152, -2.15348934, -1.86554389],
       [-1.04230807,  1.33132386,  0.52063143,  0.49936452],
       [-1.3083418 , -1.08059664,  0.60855154,  0.1262362 ],
       [ 0.87602641,  0.07077588, -0.44194904,  0.87074559]])

np.hstack([a,b])
np.vstack([a,b])

三、分割

  • numpy.split(ary, indices_or_sections, axis=0) Split an array into multiple sub-arrays.
np.split(ab, 4, axis=0)

代码分析:

import numpy as np
 
# 创建一个符合正态分布的500个股票504天的涨跌幅数据
stock_day_rise = np.random.normal(0, 1, (500, 504))
 
a = stock_day_rise[:2, 0:4]
b = stock_day_rise[10:12, 0:4]
 
# axis=1时候,按照数组的列方向拼接在一起
# axis=0时候,按照数组的行方向拼接在一起
ab = np.concatenate([a, b], axis=0)
print(ab)
"""
[[ 1.31310416 -1.21522993 -0.62558622  1.32071579]
 [-0.01132551  1.51174213 -0.64821137 -0.78082249]
 [ 1.21860002  0.89126428 -0.60071647 -1.15030537]
 [ 1.37237328 -0.38175207  1.03866532  0.85553051]]
 """
# hstack, 按照数组的列方向拼接在一起
c = np.hstack([a, b])
print(c)
"""
[[ 1.31310416 -1.21522993 -0.62558622  1.32071579  1.21860002  0.89126428
  -0.60071647 -1.15030537]
 [-0.01132551  1.51174213 -0.64821137 -0.78082249  1.37237328 -0.38175207
   1.03866532  0.85553051]]
"""
# vstack, 按照数组的行方向拼接在一起
d = np.vstack([a, b])
print(d)
"""
[[ 1.31310416 -1.21522993 -0.62558622  1.32071579]
 [-0.01132551  1.51174213 -0.64821137 -0.78082249]
 [ 1.21860002  0.89126428 -0.60071647 -1.15030537]
 [ 1.37237328 -0.38175207  1.03866532  0.85553051]]
"""
# 分隔成2个数组
e = np.split(ab, 2, axis=0)
print(e)
"""
[array([[ 1.31310416, -1.21522993, -0.62558622,  1.32071579],
       [-0.01132551,  1.51174213, -0.64821137, -0.78082249]]), array([[ 1.21860002,  0.89126428, -0.60071647, -1.15030537],
       [ 1.37237328, -0.38175207,  1.03866532,  0.85553051]])]
"""

计算实践:实现sigmoid function, 利用np.exp()
e 的值约等于2.73, e的-x次方的确切值为1/(numpy.exp(x))
在这里插入图片描述

import numpy as np
 
def sigmoid(x):
    """
    定义一个sigmoid函数
    x is input: An array
    This function is to compute the sigmoid function value
    """
    s = 1.0 / (1 + (1/np.exp(x)))
    return s
 
m = np.array([1,2,3])
print(sigmoid(m))

IO操作和数据处理:

  • np.genfromtxt("./data/numpy_test/test.csv", delimiter=’,’)
  • np.nan类型: float

一、问题?

大多数数据并不是我们自己构造的,存在文件当中。我们需要工具去获取,但是Numpy其实并不适合去读取处理数据,这里我们了解相关API,以及Numpy不方便的地方即可。

二、Numpy读取

  • genfromtxt(fname[, dtype, comments, …]) Load data from a text file, with missing values handled as specified.
    在这里插入图片描述
# 读取数据
test = np.genfromtxt("./data/numpy_test/test.csv", delimiter=',')

三、如何处理缺失值

3.1什么是缺失值

什么时候numpy中会出现nan:当我们读取本地的文件为float的时候,如果有缺失(或者为None),就会出现nan

3.2缺失值处理?

那么,在一组数据中单纯的把nan替换为0,合适么?会带来什么样的影响?

比如,全部替换为0后,替换之前的平均值如果大于0,替换之后的均值肯定会变小,所以更一般的方式是把缺失的数值替换为均值(中值)或者是直接删除有缺失值的一行

所以:

如何计算一组数据的中值或者是均值
如何删除有缺失数据的那一行(列)在pandas中介绍

t中存在nan值,如何操作把其中的nan填充为每一列的均值
t = array([[  0.,   1.,   2.,   3.,   4.,   5.],
       [  6.,   7.,  nan,   9.,  10.,  11.],
       [ 12.,  13.,  14.,  nan,  16.,  17.],
       [ 18.,  19.,  20.,  21.,  22.,  23.]])

处理逻辑:
在这里插入图片描述
缺失处理逻辑

看了上面的处理过程,非常麻烦,别担心之后我们会介绍强大的Pandas工具进行处理!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值