Numpy操作及数据基本特征计算

一、实验目的

  1. 熟练掌握numpy数组相关运算
  2. 熟练使用numpy创建矩阵
  3. 理解矩阵转置和乘法
  4. 熟练计算数据的相关系数、方差、协方差、标准差
  5. 理解并能够计算数据的基本统计特征

二、实验内容

Part1. numpy基本操作

1. 创建np数组相关操作

>>> import numpy as np
>>> np.array([1, 2, 3, 4, 5]) # 把列表转换为数组
array([1, 2, 3, 4, 5])

>>> np.array((1, 2, 3, 4, 5)) # 把元组转换成数组
array([1, 2, 3, 4, 5])

>>> np.array(range(5)) # 把range对象转换成数组
array([0, 1, 2, 3, 4])

>>> np.array([[1, 2, 3], [4, 5, 6]]) # 二维数组
array([[1, 2, 3],
       [4, 5, 6]])
       
>>> np.arange(8) # 类似于内置函数range()
array([0, 1, 2, 3, 4, 5, 6, 7])

>>> np.arange(1, 10, 2) # 创建一个数组,从1开始,到10结束(不含),步长为2;
array([1, 3, 5, 7, 9])

>>> np.linspace(0, 10, 11) # 创建一个从0到10(包含)、包含11个元素的等差数组;
array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])

>>> np.linspace(0, 10, 11, endpoint=False) # 创建一个从0到10(不含)、包含11个元素的等差数组;
array([0.        , 0.90909091, 1.81818182, 2.72727273, 3.63636364,
       4.54545455, 5.45454545, 6.36363636, 7.27272727, 8.18181818,
       9.09090909])
       
>>> np.logspace(0, 100, 10) # 相当于2 ** np.linspace(1,6,5)
array([1.00000000e+000, 1.29154967e+011, 1.66810054e+022, 2.15443469e+033,
       2.78255940e+044, 3.59381366e+055, 4.64158883e+066, 5.99484250e+077,
       7.74263683e+088, 1.00000000e+100])
       
>>> np.logspace(1,6,5, base=2) # 相当于10**np.linspace(0,100,10)
array([ 2.        ,  4.75682846, 11.3137085 , 26.90868529, 64.        ])

>>> np.zeros(3) # 全0一维数组
array([0., 0., 0.])

>>> np.ones(3) # 全1一维数组
array([1., 1., 1.])

>>> np.zeros((3,3)) # 全0二维数组,3行3列
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])
       
>>> np.zeros((3,1)) # 全0二维数组,3行1列
array([[0.],
       [0.],
       [0.]])
       
>>> np.zeros((1,3)) # 全0二维数组,1行3列
array([[0., 0., 0.]])

>>> np.ones((1,3)) # 全1二维数组,1行3列
array([[1., 1., 1.]])

>>> np.identity(3) # 创建一个3*3的单位矩阵(主对角线上全1,其他位置全0);
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
       
>>> np.random.randint(0, 50, 5) # 随机数组,5个0到50之间的数字
array([37,  9, 45, 44, 23])

>>> np.random.randint(0, 50, (3,5))  # 创建一个3行5列的二维数组,数组中每个元素为0至50(不含)中的随机整数。
array([[12, 14, 40, 40, 45],
       [31,  6, 11, 32, 34],
       [ 2, 40, 38, 25, 10]])
       
>>> np.random.rand(10) # 10个介于[0,1)的随机数
array([0.3355455 , 0.67386351, 0.53643964, 0.15268616, 0.7511857 ,
       0.2443289 , 0.60098257, 0.05482902, 0.24840424, 0.63033747])
       
>>> np.random.standard_normal(5) # 从标准正态分布中随机采样5个数字
array([-0.86587257, -0.05847928, -0.1561428 ,  0.89798639, -1.36070386])

>>> x = np.random.standard_normal(size=(3, 4, 2)) # 从标准正态分布(均值0、方差1)中随机抽取数值,组成一个3*4*2的数组;
>>> x
array([[[ 0.5206665 , -0.67507921],
        [ 0.56169048,  1.59920721],
        [-1.42209331, -2.66753795],
        [ 0.67542774,  1.60654215]],

       [[ 0.12706519, -1.21298668],
        [ 0.30144141,  1.21469816],
        [-1.22835923, -0.70216422],
        [ 0.76276218, -2.94179314]],

       [[-1.17571954,  0.19232422],
        [-0.74600448,  0.90883389],
        [-0.08900249, -0.24332165],
        [ 0.25655431, -1.23006732]]])
        
>>> np.diag([1,2,3,4]) # 对角矩阵
array([[1, 0, 0, 0],
       [0, 2, 0, 0],
       [0, 0, 3, 0],
       [0, 0, 0, 4]])

2. 测试两个数组对应元素是否足够接近

'''
① 使用np.array()创建两个数组x和y
② np.allclose(x, y)检查两个数组x和y的所有对应元素是否相等。
全部相等则返回True,否则返回False。这里应该是False。
通过设置 rtol 参数来调整允许的相对误差。如果所有元素的相对差异小于等于 rtol,则返回 True,
否则返回 False。同时也可以使用atol来设置绝对误差。
③ np.isclose(x, y)类似,返回的是对应元素是否相等或相近。
'''
import numpy as np

x = np.array([1, 2, 3, 4.001, 5])
y = np.array([1, 1.999, 3, 4.01, 5.1])

print(np.allclose(x, y))
print(np.allclose(x, y, rtol=0.2)) # 设置相对误差参数
print(np.allclose(x, y, atol=0.2)) # 设置绝对误差参数
print(np.isclose(x, y))
print(np.isclose(x, y, atol=0.2))
'''
False
True
True
[ True False  True False False]
[ True  True  True  True  True]
'''

3. 修改数组中的元素值

>>> x = np.arange(8)
>>> x
array([0, 1, 2, 3, 4, 5, 6, 7])

>>> np.append(x, 8) # 返回新数组,在尾部追加一个元素
array([0, 1, 2, 3, 4, 5, 6, 7, 8])

>>> np.append(x, [9,10]) # 返回新数组,在尾部追加多个元素
array([ 0,  1,  2,  3,  4,  5,  6,  7,  9, 10])
>>> x # 不影响原来的数组
array([0, 1, 2, 3, 4, 5, 6, 7])

>>> x[3] = 8 # 使用下标的形式原地修改元素值
>>> x  # 原来的数组被修改了
array([0, 1, 2, 8, 4, 5, 6, 7])

>>> np.insert(x, 1, 8) # 在索引为1的位置添加元素8,返回新数组
array([0, 8, 1, 2, 8, 4, 5, 6, 7])

>>> x = np.array([[1,2,3], [4,5,6], [7,8,9]]) 
>>> x[0, 2] = 4  # 修改第0行第2列的元素值
>>> x[1:, 1:] = 1 # 切片,把行下标大于等于1,且列下标也大于等于1的元素值都设置1
>>> x
array([[1, 2, 4],
       [4, 1, 1],
       [7, 1, 1]])
       
>>> x[1:, 1:] = [1,2] # 同时修改多个元素值
>>> x
array([[1, 2, 4],
       [4, 1, 2],
       [7, 1, 2]])
       
>>> x[1:, 1:] = [[1,2],[3,4]] # 同时为多个位置元素修改为多个元素值;
>>> x
array([[1, 2, 4],
       [4, 1, 2],
       [7, 3, 4]])

4. 数组与标量的运算

>>> x = np.array((1, 2, 3, 4, 5)) # 创建数组对象
>>> x
array([1, 2, 3, 4, 5])

# np数组与数值进行各种运算
>>> x * 2 
array([ 2,  4,  6,  8, 10])

>>> x / 2
array([0.5, 1. , 1.5, 2. , 2.5])

>>> x // 2
array([0, 1, 1, 2, 2], dtype=int32)

>>> x ** 3
array([  1,   8,  27,  64, 125], dtype=int32)

>>> x + 2
array([3, 4, 5, 6, 7])

>>> x % 3
array([1, 2, 0, 1, 2], dtype=int32)

>>> 2 ** x
array([ 2,  4,  8, 16, 32], dtype=int32)

>>> 2 / x
array([2.        , 1.        , 0.66666667, 0.5       , 0.4       ])

>>> 63 // x
array([63, 31, 21, 15, 12], dtype=int32)

5. 数组与数组的运算

>>> np.array([1, 2, 3, 4]) + np.array([4, 3, 2, 1]) # 等长数组相加,对应元素相加,返回信数组
array([5, 5, 5, 5])

>>> np.array([1, 2, 3, 4]) + np.array([4]) # 12.利用广播机制对于np数组中每个元素加上一个相同的值
array([5, 6, 7, 8])

>>> a = np.array((1, 2, 3))

>>> a + a # 等长数组之间的加法运算,对应元素相加
array([2, 4, 6])

>>> a * a # 等长数组之间的乘法运算,对应元素相乘
array([1, 4, 9])

>>> a - a # 等长数组之间的减法运算,对应元素相减
array([0, 0, 0])

>>> a / a # 等长数组之间的除法运算,对应元素相除
array([1., 1., 1.])

>>> a ** a # 等长数组之间的幂运算,对应元素乘方
array([ 1,  4, 27])

# 当两个不同维度的np数组相乘或者相加的时候,需要利用广播机制自动补全。
>>> a = np.array((1, 2, 3))
>>> b = np.array(([1, 2, 3], [4, 5, 6], [7, 8, 9]))
>>> c = a * b
>>> a + b
array([[ 2,  4,  6],
       [ 5,  7,  9],
       [ 8, 10, 12]])

6. 数组排序

>>> x = np.array([3, 1, 2])

>>> np.argsort(x) # 返回排序后元素的原下标
array([1, 2, 0], dtype=int64)

>>> x[_] # 使用数组做下标获取元素x[_]在这里_表示最近一次的结果,在这里就是x[np.argsort(x)]。
array([1, 2, 3])

>>> x = np.array([3, 1, 2, 4])
>>> x.argmax(), x.argmin() # 最大值和最小值的下标
(3, 1)

>>> np.argsort(x)
array([1, 2, 0, 3], dtype=int64)

>>> x[_]
array([1, 2, 3, 4])

>>> x.sort() # 原地排序
>>> x
array([1, 2, 3, 4])

7. 数组的内积运算

import numpy as np

x = np.array((1, 2, 3))
y = np.array((4, 5, 6))

# 对两个np数组使用不同方法进行点积运算
print(np.dot(x, y))
print(x.dot(y))
print(sum(x*y))
'''
32
32
32
'''

8. 访问数组中的元素

>>> import numpy as np
>>> b = np.array(([1,2,3],[4,5,6],[7,8,9]))
>>> b
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
       
>>> b[0] # 第0行所有元素
array([1, 2, 3])

>>> b[0][0] # 第0行第0列的元素
1

>>> b[0,2] # 第0行第2列的元素,等价于b[0][2]的形式
3

>>> b[[0,1]] # 第0行和第1行的所有元素,只指定行下标,不指定列下标,表示所有列
array([[1, 2, 3],
       [4, 5, 6]])
       
>>> b[[0,2,1],[2,1,0]] # 输出b的第0行2列、2行1列、1行0列的元素
array([3, 8, 4])

>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> a[::-1] # 反向切片
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])

>>> a[::2] # 在np数组中步长为2取元素
array([0, 2, 4, 6, 8])

>>> a[:5] # 前5个元素
array([0, 1, 2, 3, 4])

>>> c = np.arange(25) # 创建数组
>>> c.shape = 5,5 # 修改数组形状
>>> c
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, 24]])
       
>>> c[0, 2:5] # 第0行中下标[2,5)之间的元素值
array([2, 3, 4])

>>> c[1] # 第1行所有元素
array([5, 6, 7, 8, 9])

>>> c[2:5, 2:5] # 行下标和列下标都介于[2,5)之间的元素值
array([[12, 13, 14],
       [17, 18, 19],
       [22, 23, 24]])
       
>>> c[[1,3], [2,4]] # 第1行第2列的元素和第3行第4列的元素
array([ 7, 19])

>>> c[[1,3], 2:4] # 取出np数组c的第一行2、3列和第3行2、3列元素;
array([[ 7,  8],
       [17, 18]])
       
>>> c[:, [2,4]] # 取出c的所有行中的2、3列元素
array([[ 2,  4],
       [ 7,  9],
       [12, 14],
       [17, 19],
       [22, 24]])
       
>>> c[:, 3] # 第3列所有元素
array([ 3,  8, 13, 18, 23])

>>> c[[1,3]] # 第1行和第3行所有元素
array([[ 5,  6,  7,  8,  9],
       [15, 16, 17, 18, 19]])
       
>>> c[[1,3]][:, [2,4]] # 取出c的1、3行的2、4列元素
array([[ 7,  9],
       [17, 19]])

9. 数组对函数运算的支持

import numpy as np

x = np.arange(0, 100, 10, dtype=np.floating)
print(x)
print(np.sin(x)) # 一维数组中所有元素求正弦值
x = np.array(([1, 2, 3], [4, 5, 6], [7, 8, 9]))
print(x)

print(np.cos(x)) # 二维数组中所有元素求余弦值
print(np.round(np.cos(x))) # 四舍五入
print(np.ceil(x/2)) # 向上取整
'''
[ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90.]
[ 0.         -0.54402111  0.91294525 -0.98803162  0.74511316 -0.26237485
 -0.30481062  0.77389068 -0.99388865  0.89399666]
[[1 2 3]
 [4 5 6]
 [7 8 9]]
[[ 0.54030231 -0.41614684 -0.9899925 ]
 [-0.65364362  0.28366219  0.96017029]
 [ 0.75390225 -0.14550003 -0.91113026]]
[[ 1. -0. -1.]
 [-1.  0.  1.]
 [ 1. -0. -1.]]
[[1. 1. 2.]
 [2. 3. 3.]
 [4. 4. 5.]]
C:\Users\33036\AppData\Local\Temp\ipykernel_26212\580142187.py:3: DeprecationWarning: Converting `np.inexact` or `np.floating` to a dtype is deprecated. The current result is `float64` which is not strictly correct.
  x = np.arange(0, 100, 10, dtype=np.floating)
'''

10. 改变数组形状

>>> import numpy as np

>>> x = np.arange(1, 11, 1)
>>> x
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

>>> x.shape # 查看数组的形状
(10,)

>>> x.size # 数组中元素的数量
10

>>> x.shape = 2, 5 # 改为2行5列
>>> x
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10]])
       
>>> x.shape
(2, 5)

>>> x.shape = 5, -1 # -1表示自动计算
>>> x
array([[ 1,  2],
       [ 3,  4],
       [ 5,  6],
       [ 7,  8],
       [ 9, 10]])
       
>>> x = x.reshape(2,5) # reshape()方法返回新数组
>>> x
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10]])
       
>>> x = np.array(range(5))
>>> x.reshape((1, 10)) # 进行reshape时候,如果元素不够会报错
Traceback (most recent call last):
  File "<pyshell#134>", line 1, in <module>
    x.reshape((1, 10))
ValueError: cannot reshape array of size 5 into shape (1,10)

>>> x.resize((1,10)) # resize()可以改变数组元素个数
>>> x
array([[0, 1, 2, 3, 4, 0, 0, 0, 0, 0]])

>>> np.resize(x, (1,3)) # 使用numpy的resize()返回新数组
array([[0, 1, 2]])

>>> x # 不对原数组进行任何修改
array([[0, 1, 2, 3, 4, 0, 0, 0, 0, 0]])

11. 数组布尔运算

>>> import numpy as np
>>> x = np.random.rand(10) # 包含10个随机数的数组
>>> x
array([0.7903996 , 0.15615108, 0.95351245, 0.31781551, 0.38210409,
       0.17162399, 0.41261857, 0.90624888, 0.40526307, 0.82711914])
       
>>> x > 0.5  # 比较数组中每个元素值是否大于0.5
array([ True, False,  True, False, False, False, False,  True, False,
        True])
        
>>> x[x>0.5] # 返回x中>0.5的元素组成的数组
array([0.7903996 , 0.95351245, 0.90624888, 0.82711914])

>>> x < 0.5  # 数组元素每个元素是否小于0.5
array([False,  True, False,  True,  True,  True,  True, False,  True,
       False])
       
>>> sum((x>0.4) & (x<0.6)) # 计算x中>0.4且<0.6的元素数量
2

>>> np.all(x<1) # 测试是否全部元素都小于1
True

>>> np.any(x>0.8) # 是否存在大于0.8的元素
True

>>> a = np.array([1, 2, 3])
>>> b = np.array([3, 2, 1])
>>> a > b # 两个数组中对应位置上的元素比较
array([False, False,  True])

>>> a[a>b] # 数组a中大于b数组对应位置上元素的值
array([3])

>>> a == b
array([False,  True, False])

>>> a[a==b]
array([2])

>>> x = np.arange(1, 10)
>>> x
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> x[(x%2==0)&(x>5)] # 大于5的偶数,两个数组进行布尔与运算
array([6, 8])

>>> x[(x%2==0)|(x>5)] # 大于5的元素或者偶数元素,布尔或运算
array([2, 4, 6, 7, 8, 9])

12. 分段函数

>>> import numpy as np
>>> x = np.random.randint(0, 10, size=(1,10))
>>> x
array([[9, 0, 1, 3, 7, 6, 6, 8, 0, 7]])

>>> np.where(x<5, 0, 1) # 小于5的元素值对应0,其他对应1
array([[1, 0, 0, 0, 1, 1, 1, 1, 0, 1]])

>>> x.resize((2, 5))
>>> x
array([[9, 0, 1, 3, 7],
       [6, 6, 8, 0, 7]])
       
>>> np.piecewise(x, [x<4, x>7], [lambda x:x*2, lambda x:x*3]) # 小于4的元素乘以2,大于7的元素乘以3,其他元素变为0
array([[27,  0,  2,  6,  0],
       [ 0,  0, 24,  0,  0]])
       
>>> np.piecewise(x, [x<3, (3<x)&(x<5), x>7], [-1, 1, lambda x:x*4]) # 将np数组中小于3的用-1代替,(3, 5)之间的用1,大于7的乘以4,其他元素用0替代。
array([[36, -1, -1,  0,  0],
       [ 0,  0, 32, -1,  0]])

Part2. 数据的基本统计描述

1. 利用numpy与鸢尾花数据完成集中趋势指标统计

  1. 获取鸢尾花数据第⼀个维度的所有数据,分别组成⼀维行向量和列向量。
import numpy as np
from sklearn.datasets import load_iris
iris_data = load_iris()
data = iris_data.data # 加载数据
data_1 = data[:, 0] # 第一维数据
row = data_1.reshape((1, -1)) # 一维行向量
print(row)
column = data_1.reshape((-1, 1)) # 一维列向量
print(column)

在这里插入图片描述

  1. 计算鸢尾花数据每个属性的均值(np.mean())、中位数(np.median())
avg_value = np.mean(data, axis=0) # 每个属性均值
print("均值:", avg_value)
mid_value = np.median(data, axis=0) # 每个属性中位数
print("中位数:", mid_value)

在这里插入图片描述

2. 利用题中生成的一维行向量,完成离散趋势指标统计

  1. 计算极差(使用函数max(),min())。
  2. 计算四分位数、四分位数极差。(分位数利用np.percentile()函数,例:Q1 = np.percentile(feature_1,0.25))(四分位数极差IQR=Q3-Q1)
  3. 求五数概括
  4. 计算方差(np.var())和标准差(np.std())
jicha = np.max(row) - np.min(row)
print("极差:{:.2f}".format(jicha))
Q1 = np.percentile(row, 25)
Q2 = np.percentile(row, 50)
Q3 = np.percentile(row, 75)
Q4 = np.percentile(row, 100)
print("四分位数:Q1:{};Q2:{};Q3:{};Q4:{}".format(Q1, Q2, Q3, Q4))
IQR = Q3 - Q1
print("四分位极差:{:.5f}".format(IQR))
Minimum = Q1 - (1.5 * IQR)
Maximum = Q3 + (1.5 * IQR)
print("Minimum:{:.2f};Q1:{};Median:{};Q3:{};Maximum:{:.2f}".format(Minimum, Q1, Q2, Q3, Maximum))

print("方差", np.var(row))
print("标准差:", np.std(row))

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值