数据分析之numpy基础包

首先为啥要学numpy呢?空口无凭,看个小练习

假如有一个列表,里面有n个值,取出列表大于某个数的值

import numpy as np
import random

# 假如取出其中大于60的值
a = [random.randint(1, 100) for i in range(50)]
# print(a)

# 学python第一天
new_list = []
for i in a:
    if i > 60:
        new_list.append(i)
print(new_list)

# 学了匿名函数后
c = list(filter(lambda x: x > 60, a))
print(c)

# 学了numpy后
d = np.array(a)
print(d[d > 60])

[68, 69, 77, 69, 61, 77, 95, 96, 73, 88, 98, 74, 88, 98, 92, 63]
[68, 69, 77, 69, 61, 77, 95, 96, 73, 88, 98, 74, 88, 98, 92, 63]
[68 69 77 69 61 77 95 96 73 88 98 74 88 98 92 63]

显而易见,使用numpy之后要简单的多!即numpy将许多批量操作变得更简单,更高效!!!

一,安装环境

numpy属于python中的第三方库,需要在Windows的dos窗口或pycharm下面的Terminal中输入如下命令进行安装

pip install numpy

二,创建array

1,导入numpy包

import numpy as np
import random

2,创建array

a = [random.randint(10, 30) for i in range(10)]
b = np.array(a)  # 创建数组
print(b)
print(type(a), type(b)

[25 22 28 10 21 12 22 29 20 11]
<class 'list'> <class 'numpy.ndarray'>
a = np.array([1, 2, 3, 4, 5])
print(a)
b = np.array(range(10))
print(b)

[1 2 3 4 5]
[0 1 2 3 4 5 6 7 8 9]

3,创建多维数组

①创建二维数组

a = np.array([[1, 2, 3, 4], [6, 7, 8, 9]])
print(a)

[[1 2 3 4]
 [6 7 8 9]]
a = np.arange(5, 20).reshape((3, 5))
print(a)

[[ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]

②创建三维数组

a = np.array([[[1, 2, 3, 4], [6, 7, 8, 9]], [[2, 4, 5, 6], [3, 4, 5, 6]]])
print(a)

[[[1 2 3 4]
  [6 7 8 9]]

 [[2 4 5 6]
  [3 4 5 6]]]
a = np.arange(5, 17).reshape((2, 3, 2))
print(a)

[[[ 5  6]
  [ 7  8]
  [ 9 10]]

 [[11 12]
  [13 14]
  [15 16]]]

4,创建全0数组

print(np.array([0] * 10))
a = np.zeros(10)  # 默认是float
b = np.zeros(10, dtype=int)  # 转换为int
print(a)
print(b)

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

5,创建全1数组

print(np.ones(10))  # 默认是小数

[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]

6,创建空数组

print(np.empty(10))  # 创建空数组,以前内存中留下的值,没有意义

[6.23042070e-307 4.67296746e-307 1.69121096e-306 3.11523921e-307
 7.56599128e-307 1.37961913e-306 8.01097889e-307 1.78019082e-306
 1.78020984e-306 1.60218627e-306]

7,创建单位矩阵

print(np.eye(5))

[[1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]]

8, 其他一些

①求数组长度

b = np.array(range(20))
print(b.size)

20

print(np.linspace(1, 13, 10))  # 将1~13平均分为10份

[ 1.          2.33333333  3.66666667  5.          6.33333333  7.66666667
  9.         10.33333333 11.66666667 13.        ]

print(np.arange(10))  # 和range用法基本类似,唯一的区别是arange第三个参数可以用小数
print(np.arange(1, 10, 0.5))

[0 1 2 3 4 5 6 7 8 9]
[1.  1.5 2.  2.5 3.  3.5 4.  4.5 5.  5.5 6.  6.5 7.  7.5 8.  8.5 9.  9.5]

三,array的批量运算

1,

b = [random.randint(0, 100) for n in range(10)]
c = np.array(b)
print(c)
print(c + 1)
print(c / 3)

[72 50 91 95 35 63 66 65 53 15]
[73 51 92 96 36 64 67 66 54 16]
[24.         16.66666667 30.33333333 31.66666667 11.66666667 21.
 22.         21.66666667 17.66666667  5.        ]

2,

a = np.arange(10)
b = np.arange(5, 15)
print(a, b)
print(a + b)
print(b / a)
print(a > b)
print(a > 5)
print(a**0.5) 

[0 1 2 3 4 5 6 7 8 9] [ 5  6  7  8  9 10 11 12 13 14]
[ 5  7  9 11 13 15 17 19 21 23]
G:/untitled/data_habding/numpy_study/day1/study2.py:76: RuntimeWarning: divide by zero encountered in true_divide
  print(b / a)  # [       inf 6.         3.5        2.66666667 2.25       2.
[       inf 6.         3.5        2.66666667 2.25       2.
 1.83333333 1.71428571 1.625      1.55555556]  # inf(infinity即无穷) 比任何浮点数都大
[False False False False False False False False False False]
[False False False False False False  True  True  True  True]
[0.         1.         1.41421356 1.73205081 2.         2.23606798
 2.44948974 2.64575131 2.82842712 3.        ]

四,array的索引

1,

a = np.arange(5, 16)
print(a)  # [ 5  6  7  8  9 10 11 12 13 14 15]
print(a[0])  # 5

2,

a = np.arange(15).reshape((3, 5))  # 快速创建3行5列的二维数组
print(a)
# [[ 0  1  2  3  4]
#  [ 5  6  7  8  9]
#  [10 11 12 13 14]]

print(a[0][0])  # 0  列表式写法
print(a[0, 0])  # 0  推荐(新式写法)
print(a[1, 2])  # 7

3,布尔索引

a = np.arange(5)
print(a)
b = a[[True, False, True, False, False]]
print(b)  # [0 2]

4,花式索引

a = np.arange(5, 20).reshape((3, 5))
print(a)
# [[ 5  6  7  8  9]
#  [10 11 12 13 14]
#  [15 16 17 18 19]]
print(a[0, a[0] > 6])  # [7 8 9]

print(a[[0, 2], :][:, [1, 3]])
# [[ 6  8]
#  [16 18]]

五,array的切片

1,

a = np.arange(5, 15)  # [ 5  6  7  8  9 10 11 12 13 14]
print(a[: 3])  # [5 6 7]
print(a[-5:])  # [10 11 12 13 14]

2,

a = np.arange(5, 20).reshape((3, 5))
# [[ 5  6  7  8  9]
#  [10 11 12 13 14]
#  [15 16 17 18 19]]
print(a[:, 1])  # [ 6 11 16]
print(a[: 2, 1: 3])
# [[ 6  7]
#  [11 12]]
print(a[1:, 3:])
# [[13 14]
#  [18 19]]

3,数组和列表的一个小区别

a = list(range(5, 15))
print(a)

b = np.arange(5, 15)
print(b)

c = a[: 5]
d = b[: 5]

c[0] = 20  # [5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
d[0] = 20  # [20  6  7  8  9 10 11 12 13 14]
print(a)
print(b)

总结:数组中修改其切片中的元素,数组中也会被修改,但是列表不会

六,numpy中通用函数

1,abs取绝对值

a = np.arange(-20, 5)
print(np.abs(a))

[20 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0  1  2  3
  4]

2,sqrt开方

a = np.arange(-20, 5)
print(np.sqrt(a))

[       nan        nan        nan        nan        nan        nan
        nan        nan        nan        nan        nan        nan
        nan        nan        nan        nan        nan        nan
        nan        nan 0.         1.         1.41421356 1.73205081
 2.        ]

注:nan(即not a number)不是一个数 不等于任何浮点数(nan != nan)

3,round

①原python中

import math

print(round(3.4))  # 四舍五入取整  3

print(int(1.9))  # 直接扔掉小数位  1

print(math.floor(1.8))  # 向下取整  1
print(math.floor(-1.8))  # 向下取整  -2

print(math.ceil(1.1))  # 向上取整  2
print(math.ceil(-1.6))  # 向上取整  -1

②numpy中

a = np.arange(-5.5, 5)
print(a)
print(np.round(a))  # [-6. -4. -4. -2. -2. -0.  0.  2.  2.  4.  4.]
print(np.trunc(a))  # [-5. -4. -3. -2. -1. -0.  0.  1.  2.  3.  4.]
print(np.floor(a))  # [-6. -5. -4. -3. -2. -1.  0.  1.  2.  3.  4.]
print(np.ceil(a))  # [-5. -4. -3. -2. -1. -0.  1.  2.  3.  4.  5.]

a = np.linspace(1, 5, 10)
print(a)
print(np.round(a, 2))  # 取两位小数

[1.         1.44444444 1.88888889 2.33333333 2.77777778 3.22222222
 3.66666667 4.11111111 4.55555556 5.        ]
[1.   1.44 1.89 2.33 2.78 3.22 3.67 4.11 4.56 5.  ]

4,modf 剥离小数位和整数位

a = np.arange(-5.5, 5.5)
print(a)
print(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.]))

5,两个特殊的浮点数

①nan

# nan(nan即not a number)不是一个数 不等于任何浮点数(nan != nan)
print(float('nan'))  # nan

a = np.arange(0, 5)
print(a / a)  # [nan  1.  1.  1.  1.]

print(np.nan)  # 创建nan
print(np.nan == np.nan)  # False

如何判断数据里有没有nan

a = np.array([0, 3, 6, 8, 0])
b = a / a
print(np.isnan(b))  # 判断数据里面有没有nan  [ True False False False  True]
print(b[~np.isnan(b)])  # [1. 1. 1.]  去掉里面的nan

②inf

# inf(infinity即无穷) 比任何浮点数都大
print(float('inf'))  # inf

如何判断数据里有没有inf

a = np.array([3, 4, 6, 9])  # [inf 1.  inf 4.5] 表示无穷大
b = np.array([0, 4, 0, 2])
c = a / b
print(np.inf == np.inf)  # True
print(c[~np.isinf(c)])  # [1.  4.5]  去掉里面的inf
print(c[c!=np.inf])  # [1.  4.5]  去掉里面的inf

6,maximum 返回两个数组中一一对应位置上最大的一个值

a = np.array([3, 5, 6, 8])
b = np.array([5, 8, 2, 1])
print(np.maximum(a, b))  # [5 8 6 8]

7,minimum 返回两个数组中一一对应位置上最小的一个值

a = np.array([3, 5, 6, 8])
b = np.array([5, 8, 2, 1])
print(np.minimum(a, b))  # [3 5 2 1]

七,数学和统计方法

1,sum()求和

a = np.array([3, 5, 6, 8])
print(a.sum())  # 22

2,mean()求平均值

a = np.array([3, 5, 6, 8])
print(a.mean())  # 5.5

3,var()求方差(整组数据的离散程度)

a = np.array([3, 5, 6, 8])
print(a.var())  # 3.25

4,std()求标准差(方差开方)

a = np.array([3, 5, 6, 8])
print(a.std())  # 1.8027756377319946

5,max() min()求最大值,最小值

a = np.array([3, 5, 6, 8])
print(a.max())  # 8
print(a.min())  # 3

6,argmax() argmin() 求最大数下标,最小数下表

a = np.arange(-10, 10)
print(a.argmax())  # 19
print(a.argmin())  # 0

八,随机生成数

1,random库中的用法

print(random.random())  # 返回[0, 1)的随机浮点数
print(random.randint(1, 10))  # 返回[1.10]的随机整数
print(random.choice(list(range(3, 10))))  # 从所给列表中随机选一个元素返回

a = list(range(5, 15))
random.shuffle(a)  # 打乱列表
print(a)

print(random.uniform(1, 10))  # [1,10]随机返回一个浮点数

2,numpy中的用法

print(np.random.randint(0, 10))  # 8
print(np.random.randint(0, 10, 10))  # [0 1 5 8 4 7 3 6 8 6]
print(np.random.randint(0, 10, (3, 5)))
# [[2 9 2 3 6]
#  [9 2 8 4 1]
#  [5 3 1 6 5]]

print(np.random.random(10))  # [0.33031099 0.35918637 0.65868327 0.74442108 0.71771834 0.74782961
                                # 0.15125635 0.17983218 0.37393755 0.77529924]
print(np.random.random())  # 0.7375970998290451
print(np.random.rand())  # 0.4410851788926652
print(np.random.rand(10))  # [0.14405128 0.0463478  0.97758344 0.03100739 0.94210667 0.70551171
                                # 0.91935786 0.43250767 0.78710345 0.78756913]

print(np.random.randint(1, 19))  # 16
print(np.random.randint(1, 19, 10))  # [ 7 15 17 12 18 14 13 15  5 16]

print(np.random.choice(np.arange(1, 10)))  # 随机选一个

a = np.arange(3, 13)
np.random.shuffle(a)  # 随机打乱顺序
print(a)

print(np.random.uniform(1, 10))  # 随机返回一个浮点数
print(np.random.uniform(1, 10, 10))  # 随机返回十个浮点数
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值