Python数据分析学习系列一——Numpy入门学习

  • Numpy是高性能科学计算和数据分析的基础包。它是Pandas等其他各种工具的基础。
  • Numpy的主要功能:
    • ndarray,一个多维数组结构,高效且节省空间
    • 无需循环对整租数据进行快速运算的数学函数
    • 线性代数、随机数生成和傅里叶变换功能
  • 安装方法:pip install numpy
  • 引用方式:import numpy as np
import numpy as np

1 为什么用numpy?

  • 已知若干家跨国公式市值,要转换成人民币。
  • 已知购物车中没见商品的价格与商品件数,求总金额。
import random
a = [random.uniform(100.0, 200.0) for i in range(50)] #假设已知50家公司市值
x = 6.8 #1美元=6.8元人民币
# 转换成人民币,列表——循环
b = []
for each in a:
    b.append(each*x)
# 转换成人民币,数组——“*”
a = np.array(a)
a*x
array([ 971.54836946, 1230.25801894, 1009.93695086,  778.07069875,
       1347.34192239,  830.85694411,  992.91816716,  968.82463502,
        790.61843367,  750.04659306,  995.04823811,  940.83119352,
        872.12366111, 1126.5645099 , 1015.98732282, 1286.79370318,
        948.98123827, 1101.00354637,  749.46386142, 1343.44109031,
       1183.17936556, 1235.68030649,  981.63529056, 1231.32330003,
        963.56396015,  923.67919752, 1053.00562042, 1341.81973736,
       1155.96713625,  873.60675873,  939.44328417,  700.71536278,
       1123.45339544,  938.23929525,  971.43311266, 1207.33747815,
       1318.36436382, 1159.48810275,  959.64425333,  733.97983522,
        765.57555447,  826.24023719, 1254.31439198, 1050.46916221,
       1103.59573233,  707.05767038,  698.0050053 , 1068.71018975,
       1261.34352252,  832.40313494])
a = [random.uniform(10.0,20.0) for i in range(50)]
b = [random.randint(1,10) for i in range(50)]
a = np.array(a) #s转换成数组
b = np.array(b)
(a * b).sum()# a×b并求和
3676.0083431293015

2 Numpy基础

2.1 创建ndarray:np.arrray(array_like)

  • 数组与列表的区别:
    • 数组对象内的元素类型必须相同
    • 数组大小不可改变
np.array([1,2,3,4,5])
array([1, 2, 3, 4, 5])
a = np.array(range(10))
a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.array(range(10), dtype='float')
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])

2.2 ndarray-数据类型

  • 布尔型:bool_
  • 整型:int_ int8 int16 int32 int54
  • 无符号整数:uint8 uint16 uint32 uint54
  • 浮点型:float_ float16 float32 float64
  • 复数型:complex_ complex64 complex128
a = np.array(range(10))
a.dtype# 返回数据类型
dtype('int32')

2.3 ndarray-常用属性

  • T 数组的转置(一维数组不能转置)
  • size 数组元素的个数
  • ndim 数组的维数
  • shape 数组的维度大小(返回元组形式)
  • dtype 数组元素的数据类型
a.size# 返回元素个数
10
a = np.array([[1,2,3],[4,5,6]])
a
array([[1, 2, 3],
       [4, 5, 6]])
a.size
6
a.shape
(2, 3)
a = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
a.shape
(2, 2, 3)
a = np.array([[1,2,3],[4,5,6]])
a.T
array([[1, 4],
       [2, 5],
       [3, 6]])
_.T
array([[1, 2, 3],
       [4, 5, 6]])
a = np.array(range(10))
a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
a.T
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

2.4 ndarray的其他创建方式

  • array():将列表转换为数组,可选择显式制定dtype
  • arange():是range的numpy版,支持浮点数
  • linspace():类似arange(),第三个参数为数组长度
  • zeros():指定形状和dtype创建全0数组
  • ones():指定形状和dtype创建全1数组
  • empty():指定形状和dtype创建全空数组(随机值)
  • eye():根据指定边长和dtype创建单位矩阵
# 创建10个全是0的数组
np.array([0]*10)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
np.zeros(10) # 返回浮点数
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
a = np.zeros(10)
a.dtype
dtype('float64')
np.zeros(10, dtype='int')# 增加数据类型参数,创建整数型数组
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
a = np.ones(10)
a
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
a = np.empty(100)#创建一个随机的数组。
a
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

注:创建数组是先在内存里面申请一定数量的位置,然后把值改成相应的数据,而np.empty()只有第一个步骤。

np.arange(100)#与range()功能类似
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, 25, 26, 27, 28, 29, 30, 31, 32, 33,
       34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
       51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
       68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
       85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99])
np.arange(2,10)
array([2, 3, 4, 5, 6, 7, 8, 9])
np.arange(2,10,3)
array([2, 5, 8])
np.arange(2,10,0.3)#np.arange()的步长可以是小数,但是range()的步长只能是整数
array([2. , 2.3, 2.6, 2.9, 3.2, 3.5, 3.8, 4.1, 4.4, 4.7, 5. , 5.3, 5.6,
       5.9, 6.2, 6.5, 6.8, 7.1, 7.4, 7.7, 8. , 8.3, 8.6, 8.9, 9.2, 9.5,
       9.8])
np.linspace(0,100,100)#第3个参数是分成多少份
array([  0.        ,   1.01010101,   2.02020202,   3.03030303,
         4.04040404,   5.05050505,   6.06060606,   7.07070707,
         8.08080808,   9.09090909,  10.1010101 ,  11.11111111,
        12.12121212,  13.13131313,  14.14141414,  15.15151515,
        16.16161616,  17.17171717,  18.18181818,  19.19191919,
        20.2020202 ,  21.21212121,  22.22222222,  23.23232323,
        24.24242424,  25.25252525,  26.26262626,  27.27272727,
        28.28282828,  29.29292929,  30.3030303 ,  31.31313131,
        32.32323232,  33.33333333,  34.34343434,  35.35353535,
        36.36363636,  37.37373737,  38.38383838,  39.39393939,
        40.4040404 ,  41.41414141,  42.42424242,  43.43434343,
        44.44444444,  45.45454545,  46.46464646,  47.47474747,
        48.48484848,  49.49494949,  50.50505051,  51.51515152,
        52.52525253,  53.53535354,  54.54545455,  55.55555556,
        56.56565657,  57.57575758,  58.58585859,  59.5959596 ,
        60.60606061,  61.61616162,  62.62626263,  63.63636364,
        64.64646465,  65.65656566,  66.66666667,  67.67676768,
        68.68686869,  69.6969697 ,  70.70707071,  71.71717172,
        72.72727273,  73.73737374,  74.74747475,  75.75757576,
        76.76767677,  77.77777778,  78.78787879,  79.7979798 ,
        80.80808081,  81.81818182,  82.82828283,  83.83838384,
        84.84848485,  85.85858586,  86.86868687,  87.87878788,
        88.88888889,  89.8989899 ,  90.90909091,  91.91919192,
        92.92929293,  93.93939394,  94.94949495,  95.95959596,
        96.96969697,  97.97979798,  98.98989899, 100.        ])
np.linspace(0,100,101)
# linspace()是前后都包括了
# 分成了101份(包括0)
# 常用于画函数图像
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.,  25.,  26.,  27.,  28.,  29.,  30.,  31.,  32.,
        33.,  34.,  35.,  36.,  37.,  38.,  39.,  40.,  41.,  42.,  43.,
        44.,  45.,  46.,  47.,  48.,  49.,  50.,  51.,  52.,  53.,  54.,
        55.,  56.,  57.,  58.,  59.,  60.,  61.,  62.,  63.,  64.,  65.,
        66.,  67.,  68.,  69.,  70.,  71.,  72.,  73.,  74.,  75.,  76.,
        77.,  78.,  79.,  80.,  81.,  82.,  83.,  84.,  85.,  86.,  87.,
        88.,  89.,  90.,  91.,  92.,  93.,  94.,  95.,  96.,  97.,  98.,
        99., 100.])
import matplotlib.pyplot as plt
x = np.linspace(-10,10,10000)
y = x**2
plt.plot(x,y)
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2JftPwsv-1612016077555)(output_41_0.png)]

np.eye(10)# 生成单位矩阵
array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]])

2.5 ndarray-批量运算

  • 数组和标量之间的运算
    • a+1
    • a*3
    • 1//a
    • a**5
    • a>5
  • 同样大小数组之间的运算
    • a+b
    • a/b
    • a**b
    • a%b
    • a==b
a = np.arange(10)
a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
a + 1
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
a * 3
array([ 0,  3,  6,  9, 12, 15, 18, 21, 24, 27])
3 / a
c:\users\ibm\appdata\local\programs\python\python37\lib\site-packages\ipykernel_launcher.py:1: RuntimeWarning: divide by zero encountered in true_divide
  """Entry point for launching an IPython kernel.





array([       inf, 3.        , 1.5       , 1.        , 0.75      ,
       0.6       , 0.5       , 0.42857143, 0.375     , 0.33333333])
b = np.arange(10,20)
b
array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
a + b
array([10, 12, 14, 16, 18, 20, 22, 24, 26, 28])
a * b
array([  0,  11,  24,  39,  56,  75,  96, 119, 144, 171])
a > b
array([False, False, False, False, False, False, False, False, False,
       False])
a[0] = 10
a > b
array([False, False, False, False, False, False, False, False, False,
       False])

2.6 ndarray-索引

# 一维数组索引
a = np.arange(10)
a[0]
0
# 二位数组索引
a = np.arange(15).reshape((3,5))
a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
a[0][0]
0
a[0,0]
0
a[2,2]
12

2.7 ndarray-切片

# 一维数组切片
a = np.arange(15)
a
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])
a[:4]
array([0, 1, 2, 3])
a[4:]
array([ 4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])
b = list(range(15))
b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
c = a[:4] #相当于引用,做了一个视图
c
array([0, 1, 2, 3])
d = b[:4] #创建一个新的
d
[0, 1, 2, 3]
c[0] = 20
d[0] = 20 
a
array([20,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])
b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
# 如果想要创建一个新的数组,使用copy()函数。
a = np.arange(10)
e = a[:4].copy()
e[0] = 20
e
array([20,  1,  2,  3])
a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 二维数组切片
a = np.arange(15).reshape((3,5))
a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
a[0:2, 0:2]
array([[0, 1],
       [5, 6]])
a[::2,1::2]
array([[ 1,  3],
       [11, 13]])

2.8 ndarray-布尔型索引

a = [random.randint(0, 10) for i in range(20)]
a
[9, 8, 2, 1, 4, 4, 0, 10, 6, 6, 3, 9, 3, 4, 4, 9, 2, 0, 1, 1]
# 找出一个数组中所有大于5的数
list(filter(lambda x : x > 5, a))
[9, 8, 10, 6, 6, 9, 9]
a = np.array(a)
a[a > 5]
array([ 9,  8, 10,  6,  6,  9,  9])
# 找出一个数组中所有大于5的偶数
a[(a > 5) & (a % 2 == 0)]
array([ 8, 10,  6,  6])

2.9 ndarray-花式索引

a = np.arange(20)
a
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19])
a[[1,3,5,7]]
array([1, 3, 5, 7])
a = np.arange(20).reshape((4,5))
a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])
a[0, 2:4]
array([2, 3])
a[0, a[0]>2]
array([3, 4])
a[[1,3],[1,3]]# 取的是[1,1]和[3,3]位置上的值
array([ 6, 18])
a[1::2,1::2]
array([[ 6,  8],
       [16, 18]])
a[[1,3],:][:,[1,3]]
array([[ 6,  8],
       [16, 18]])

2.10 Numpy-通用函数

  • 通用函数:能同时对数组中所有元素进行运算的函数
  • 常见通用函数:
    • 一元函数:abs,sqrt, exp, log, ceil, floor, rint, trunc, modf, isnan, isinf, cos, sin, tan
    • 二元函数:add, substract, multiply, divide, power, mod, maximun, minimun
a = np.arange(-5, 5)
np.abs(a)
array([5, 4, 3, 2, 1, 0, 1, 2, 3, 4])
a = np.arange(10)
np.sqrt(a)
array([0.        , 1.        , 1.41421356, 1.73205081, 2.        ,
       2.23606798, 2.44948974, 2.64575131, 2.82842712, 3.        ])
a = 1.6
int(a)#向0取整
1
round(a)#向0四舍五入
2
a = -1.6
int(a)
-1
round(a)
-2
import math
math.floor(a)#向下取整
-2
math.ceil(a)# 向上取整
-1
a = np.arange(-5.5, 5.5)
a
array([-5.5, -4.5, -3.5, -2.5, -1.5, -0.5,  0.5,  1.5,  2.5,  3.5,  4.5])
np.floor(a)
array([-6., -5., -4., -3., -2., -1.,  0.,  1.,  2.,  3.,  4.])
np.ceil(a)
array([-5., -4., -3., -2., -1., -0.,  1.,  2.,  3.,  4.,  5.])
np.round(a)
array([-6., -4., -4., -2., -2., -0.,  0.,  2.,  2.,  4.,  4.])
np.trunc(a)#相当于单个数值时的int()
array([-5., -4., -3., -2., -1., -0.,  0.,  1.,  2.,  3.,  4.])
np.rint(a)# 相当于np.round()
array([-6., -4., -4., -2., -2., -0.,  0.,  2.,  2.,  4.,  4.])
np.modf(a)#把整数部分和小数部分分开
(array([-0.5, -0.5, -0.5, -0.5, -0.5, -0.5,  0.5,  0.5,  0.5,  0.5,  0.5]),
 array([-5., -4., -3., -2., -1., -0.,  0.,  1.,  2.,  3.,  4.]))

浮点数特殊值

  • nan(Not a number):不等于任何浮点数(nan!=nan)
  • inf(infinity):比任何浮点数都大
  • Numpy中创建特殊值:np.nan,np.inf
  • 在数据分析中,nan常被用做表示数据缺失值
float('nan')#把字符串nan转换成浮点数不会报错
nan
a = np.nan
a
nan
a != np.nan
True
a = np.arange(5)
b = a/a
b
c:\users\ibm\appdata\local\programs\python\python37\lib\site-packages\ipykernel_launcher.py:2: RuntimeWarning: invalid value encountered in true_divide
  





array([nan,  1.,  1.,  1.,  1.])
np.nan in b
False
np.isnan(b)
array([ True, False, False, False, False])
b[~(np.isnan(b))]
array([1., 1., 1., 1.])

2.11 Numpy数学和统计方法

  • sum 求和
  • mean 求平均数
  • min 求最小值
  • max 求最大值
  • std 求标准差
  • var 求方差
  • argmin求最小值索引
  • argmax求最大值索引
a = np.array([3,4,5,6,7])
a
array([3, 4, 5, 6, 7])
a.sum()
25
a.mean()
5.0
a = np.arange(0,10,0.2)
a
array([0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2, 1.4, 1.6, 1.8, 2. , 2.2, 2.4,
       2.6, 2.8, 3. , 3.2, 3.4, 3.6, 3.8, 4. , 4.2, 4.4, 4.6, 4.8, 5. ,
       5.2, 5.4, 5.6, 5.8, 6. , 6.2, 6.4, 6.6, 6.8, 7. , 7.2, 7.4, 7.6,
       7.8, 8. , 8.2, 8.4, 8.6, 8.8, 9. , 9.2, 9.4, 9.6, 9.8])
a.mean()+a.std()
7.786173937932363
a.mean()-a.std()
2.0138260620676376
a.argmax()
49
a.argmin()
0

生成随机数

  • 随机函数在np.random子包内
    • rand给定形状产生随机数组(0到1之间的数)
    • randint给定形状生成随机整数
    • choice给定形状产生随机选择
    • shuffle与random模块里面的shuffle()功能一样
    • uniform给定形状产生随机数组
import random
random.random()#返回0~1之间的浮点数
0.33974840838056275
random.randint(0,10)
1
random.choice([1,3,4,5])
3
random.shuffle(a)# 改变的是原列表中元素的位置
a
[4, 3, 1, 2]
np.random.randint(0,10)
3
np.random.randint(0,10,10)
array([0, 9, 2, 5, 7, 8, 7, 5, 0, 9])
np.random.randint(0,10,(3,5))
array([[0, 5, 4, 3, 9],
       [9, 7, 7, 7, 3],
       [9, 1, 2, 4, 8]])
np.random.rand(10)
array([0.87378977, 0.33263006, 0.16150175, 0.64087174, 0.84878454,
       0.55151132, 0.13053042, 0.10932033, 0.73284465, 0.78065613])
np.random.rand(15).reshape((3,5))
array([[0.03878439, 0.98258217, 0.79012658, 0.25156537, 0.14919864],
       [0.83778259, 0.58277696, 0.19777845, 0.88624567, 0.52116526],
       [0.26123987, 0.549867  , 0.15060013, 0.19665386, 0.56762764]])
np.random.choice([1,2,3,4,5])
4
np.random.choice([1,2,3,4,5],10)
array([1, 2, 1, 2, 2, 3, 2, 4, 1, 3])
a = [1,2,3,4]
np.random.shuffle(a)# 改变的是原数组中元素的位置
a
[1, 2, 4, 3]
random.uniform(2.0,4.0)
2.766299467157591
np.random.uniform(2.0,4.0,10)
array([2.24885655, 2.96570215, 3.42231782, 2.32249887, 3.29880152,
       3.38426602, 2.22924905, 2.20250663, 3.53510689, 2.40333176])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值