2020年Python数据分析学习笔记之Numpy运用(四)

目录

1、Numpy的基础用法

(1)数组的创建和属性

(2)索引和切片

2、Numpy的高级用法

(1)数组形状的改变

(2)数组的ufunc广播机制

(3)排序和搜索

3、Numpy文件读写

(1)Numpy文件读取

(2)Numpy文件存储

(3)Numpy字符串操作

4、Numpy统计计算

(1)Numpy随机数生成

(2)Numpy统计相关函数

(3)Numpy线性代数


1、Numpy的基础用法

(1)数组的创建和属性

# 数组的创建

import numpy as np       # 导入库

arr1 = np.array([1,2,3,4,5])      # 创建数组
# print(arr1)

arr2 = np.array([2,3,5,7], dtype='str')        # 设置数组的数据类型dtype()
# print(arr2)

# 二维数组的创建
arr3 = np.arange(0,20,2)
# print(arr3)

# 产生一个位数为10的等差数列
arr4 = np.linspace(1,10,10, endpoint=False)
# arr4 = np.linspace(1,10,11)
# print(arr4)

# 产生一个位数为10的等比数列
arr5 = np.logspace(1,5,base=2,num=10)
# print(arr5)

# 创建一个全为0的数组
arr6 = np.zeros([5,6])
# print(arr6)

# 创建一个全为1的数组
arr7 = np.ones([5,6])
# print(arr7)


# 创建一个对角线全为1的数组,其余数据全为0
arr8 = np .eye(6)
# print(arr8)

# 创建一个对角线为1,2,3,4,5,6的数组,其余数据全为0
arr9 = np.diag([1,2,3,4,5,6])
# arr9 = np.diag([1,2,3,4,5,6])+1
# print(arr9)
# print(arr9.ndim)                  # .ndim查看数组维度
# print(arr9.shape)                   # .shape查看数组行列数
# print(arr9.size)                   # .siae查看数组有多少元素
# print(arr9.dtype)                    # .stype查看数组的数据类型

(2)索引和切片

一维数组索引和切片:

import numpy as np

arr = np.arange(1,10)     # 创建一个一维数组
print(arr)
# >>> [1 2 3 4 5 6 7 8 9]

print(arr[2:3])     # 索引数组中第三位数字
# >>> [3]

print(arr[::-1])    # 倒序输出数组
# >>> [9 8 7 6 5 4 3 2 1]

print(arr[-1])      # 访问数组最后一个元素
# >>> 9

print(arr[-4:-2])     # 访问数组第三位和第四位数字
# >>> [6 7]

arr[5] = 12        # 修改数组第六位元素为12
arr[1:3] = [14,15]    # 修改数组第二位和第三位数字
print(arr)
# >>> [ 1 14 15  4  5 12  7  8  9]


# .copy方法将一个数组赋值给另一个数组,当修改赋值的数组时,原数组中的数据不发生任何改变
# arr1 = np.arange(11,21)
# arr2 = arr1.copy()
# arr2[1:3] = [5,6]
# print(arr1)
# print(arr2)

# >>> [11 12 13 14 15 16 17 18 19 20]
# >>> [11  5  6 14 15 16 17 18 19 20]

二维数组索引和切片:

简单索引

import numpy as np

# 创建一个二维数组
data = ((1,2,3,4,5,6),(2,3,4,5,6,7),(3,4,5,6,7,8),(4,5,6,7,8,9))
arr = np.array(data)
print(arr)
'''
打印结果:
[[1 2 3 4 5 6]
 [2 3 4 5 6 7]
 [3 4 5 6 7 8]
 [4 5 6 7 8 9]]
'''

# print(arr[2])      # 打印数组第三行数据
# >>> [3 4 5 6 7 8]

print(arr[2,1])    # 打印数组第三行第二位数据
# print(arr[2][1])   # 打印数组第三行第二位数据
# >>> 4

print(arr[:,2:4])    # 访问数组第三列到第四列数据
'''
打印结果:
[[3 4]
 [4 5]
 [5 6]
 [6 7]]
'''

# print(arr[1:,2:])      # 访问数组第二行到最后一行并且是第三列的数据
'''
打印结果:
[[4 5 6 7]
 [5 6 7 8]
 [6 7 8 9]]
'''

print(arr[arr>5])      # 打印数组中大于5的元素
# >>> [6 6 7 6 7 8 6 7 8 9]

print((arr>5) & (arr>7))
'''
打印结果:
[[False False False False False False]
 [False False False False False False]
 [False False False False False  True]
 [False False False False  True  True]]
'''
print(arr[(arr>5) & (arr>7)])
# >>> [8 8 9]

花式索引

import numpy as np

# 创建一个二维数组
data = ((1,2,3,4,5,6),(2,3,4,5,6,7),(3,4,5,6,7,8),(4,5,6,7,8,9))
arr = np.array(data)
print(arr)
'''
打印结果:
[[1 2 3 4 5 6]
 [2 3 4 5 6 7]
 [3 4 5 6 7 8]
 [4 5 6 7 8 9]]
'''

# print(arr[[2,1]])     # 指定输出第三行和第二行数据
'''
打印结果:
[[3 4 5 6 7 8]
 [2 3 4 5 6 7]]
'''

print(arr[[3,2],[0,1]])    # arr[3,0]  arr[2,1]  指定输出第四行第一个元素和第三行第二个元素
# >>> [4 4]

# 对行数不做限制,对列数做限制
print(arr[:,[2,0]])      # 访问第三行和第一行,二维结构
'''
打印结果:
[[3 1]
 [4 2]
 [5 3]
 [6 4]]
'''

print(arr[:, 1])     # 访问第二列数据,一维结构
# >>> [2 3 4 5]

print(arr[np.ix_([0, -1], [0,1,3])])    # 访问第一行和最后一行的第一列、第二列以及第四列数据
# print(arr[[0,-1]][:, [0, 1, 3]])
'''
打印结果:
[[1 2 4]
 [4 5 7]]
'''

2、Numpy的高级用法

(1)数组形状的改变

.reshape()

import numpy as np

data = ((1,2,3,4,5),(3,4,5,3,6),(3,6,9,4,6),(4,6,8,2,5))
arr = np.array((data))
print(arr)
'''
[[1 2 3 4 5]
 [3 4 5 3 6]
 [3 6 9 4 6]
 [4 6 8 2 5]]
'''

# .reshape() 改变数组的行列数,但不会改变原数组
print(arr.reshape(5,4))
'''
[[1 2 3 4]
 [5 3 4 5]
 [3 6 3 6]
 [9 4 6 4]
 [6 8 2 5]]
'''

.resize()

import numpy as np

data = ((1,2,3,4,5),(3,4,5,3,6),(3,6,9,4,6),(4,6,8,2,5))
arr = np.array((data))
print(arr)
'''
[[1 2 3 4 5]
 [3 4 5 3 6]
 [3 6 9 4 6]
 [4 6 8 2 5]]
'''

# .resize()  改变数组的行列数,也直接改变原数组
arr.resize(5,4)
print(arr)
'''
[[1 2 3 4]
 [5 3 4 5]
 [3 6 3 6]
 [9 4 6 4]
 [6 8 2 5]]
'''

.shape

import numpy as np

data = ((1,2,3,4,5),(3,4,5,3,6),(3,6,9,4,6),(4,6,8,2,5))
arr = np.array((data))
print(arr)
'''
[[1 2 3 4 5]
 [3 4 5 3 6]
 [3 6 9 4 6]
 [4 6 8 2 5]]
'''

arr.shape = (5,4)
print(arr)
'''
[[1 2 3 4]
 [5 3 4 5]
 [3 6 3 6]
 [9 4 6 4]
 [6 8 2 5]]
'''

 将二维数组降为一维数组:

import numpy as np

data = ((1,2,3,4,5),(3,4,5,3,6),(3,6,9,4,6),(4,6,8,2,5))
arr = np.array((data))
print(arr)
'''
[[1 2 3 4 5]
 [3 4 5 3 6]
 [3 6 9 4 6]
 [4 6 8 2 5]]
'''

# 横向降维
# print(arr.ravel())     # 方法一
print(arr.flatten())     # 方法二
# >>> [1 2 3 4 5 3 4 5 3 6 3 6 9 4 6 4 6 8 2 5]

# 纵向降维
# print(arr.ravel(order='F'))     # 方法一
print(arr.flatten(order='F'))     # 方法二
# >>> [1 3 3 4 2 4 6 6 3 5 9 8 4 3 4 2 5 6 6 5]


# 行列变换
print(arr.reshape(2,10))      # 方法一
# print(arr.reshape(2,-1))      # 方法二
'''
[[1 2 3 4 5 3 4 5 3 6]
 [3 6 9 4 6 4 6 8 2 5]]
'''

(2)数组的ufunc广播机制

(3)排序和搜索

排序函数:sort函数和argsort函数,注意argsort返回的是从小到大的索引值;

import numpy as np


# np.sort  升序排序
a = np.array([2,7,3,9,5,14,8,4,1,6,8,4,8,9,5,3,45])
# 方法一
# a = np.sort(a)
# 方法二
sorted(a)
print(a)
# >>> [ 1  2  3  3  4  4  5  5  6  7  8  8  8  9  9 14 45]

# 降序排列
# b = sorted(a, reverse=True)
b = np.array(sorted(a, reverse=True))   # 转换成数组
b = np.argsort(b)     # np.argsort 排完序后原数据在数据中的位置
print(b)
# >>> [45, 14, 9, 9, 8, 8, 8, 7, 6, 5, 5, 4, 4, 3, 3, 2, 1]

搜索函数:agrmax和agrmin函数;

import numpy as np

# np.sort  升序排序
a = np.array([2,7,3,9,5,14,8,4,1,6,8,4,8,9,5,3,45])

print(a.argmax())    # 返回数据中最大值所在的位置
# >>> 16
print(a.argmin())    # 返回数据中最小值所在的位置
# >>> 8



arr1 = np.array([[0,1,3],[4,2,9],[4,5,9],[1,-3,4]])
'''
[[ 0  1  3]
 [ 4  2  9]
 [ 4  5  9]
 [ 1 -3  4]]
'''
print(arr1.argmax(axis=0))     # 按列进行操作,返回每列最大值的位置
# >>> [1 2 1]
print(arr1.argmin(axis=0))     # 按列进行操作,返回每列最小值的位置
# >>> [0 3 0]

条件赋值:np.where可以自定义返回满足条件的情况,np.extract返回满足条件的元素值。

import numpy as np

arr = np.arange(12).reshape(4,3)
'''
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
'''
arr = np.where(arr > 4, '1','0')
print(arr)
'''
[['0' '0' '0']
 ['0' '0' '1']
 ['1' '1' '1']
 ['1' '1' '1']]
'''
import numpy as np

arr = np.arange(12).reshape(4,3)
'''
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
'''

arr = np.extract(arr > 4, arr)
print(arr)
'''
[ 5  6  7  8  9 10 11]
'''

 

3、Numpy文件读写

(1)Numpy文件读取

A、可以使用genfromtxt读取txt或者csv文件;

B、可以使用loadtxt读取txt或者csv文件;

C、两个函数功能类似,genfromtxt针对的更多是结构化数据。

import numpy as np

# 读取文件
data = np.genfromtxt('arr.txt', delimiter=',')

data = np.genfromtxt('sales.csv', delimiter=',', skip_header=1)      # skip_header=1表示跳过表头读取数据

# 使用loadtxt读取
data = np.loadtxt('arr.txt', delimiter=',')

(2)Numpy文件存储

A、一般存储为txt或者csv文件;

B、savetxt(fname,data,delimiter,fmt);

c、一般常用以上的四个参数,分别为保存的路径,数据,分隔符和格式。

import numpy as np

# 读取文件
data = np.genfromtxt('arr.txt', delimiter=',')

# 存储txt数据
np.savetxt('arr1.txt',data, delimiter=',', fmt='%.3f')

# 存储csv数据
np.savetxt('arr1.csv',data, delimiter=',', fmt='%.3f')

(3)Numpy字符串操作

char模块

import numpy as np

#  np.char.upper  字母变成大写的语法
str_list = ['Hello', 'world']
str_arr = np.char.upper(str_list)
print(str_arr)
# >>> ['HELLO' 'WORLD']


# >>> np.char.add  字符串的拼接
a = np.char.add(['中国', '爱好'], ['人民', '和平'])
print(a)
# >>> ['中国人民' '爱好和平']


# >>> np.char.multiply 多次复制
b = np.char.multiply(['中国','人民'], 3)
print(b)

# np.char.join 字符串的分割与拼接
c = np.char.join([':','-'],['China','peace'])
print(c)
# >>> ['C:h:i:n:a' 'p-e-a-c-e']

# np.char.replace 修改字符串
A = ['人生苦短', '我不学python']
d = np.char.replace(A, '不学', '学')
print(d)
# >>> ['人生苦短' '我学python']


# np.char.strip  去除多余部分语法
B = [',中国', ',人民', '爱好', ',和平']
e = np.char.strip(B, ',')
print(e)
# >>> ['中国' '人民' '爱好' '和平']

# np.char.find(列表名,'查找内容') 此语法用于查找内容

4、Numpy统计计算

(1)Numpy随机数生成

Numpy随机数生成通过random函数进行生成,生成的都是伪随机数。

random函数:

import numpy as np

# np.random.random() 随机生成0到1的浮点数
print(np.random.random())
# >>> 0.923892421471367

# >>> # np.random.random(100) 随机生成100个0到1的浮点数
print(np.random.random(100))


# 随机生成一个四行三列的随机数
print(np.random.random([4,3]))
'''
[[0.77571289 0.17747931 0.19031084]
 [0.78796167 0.55427268 0.0562924 ]
 [0.28150098 0.87504422 0.01081581]
 [0.7561027  0.91834593 0.07259151]]
'''

randint函数:

import numpy as np

# np.random.randint 随机生成整数
print(np.random.randint(0,100, size=10))
# >>> [31 19 60 15 63 48 52 88 13 26]


# 随机生成给定范围的随机整数
print(np.random.randint(0,100, size=[5, 5]))
'''
[[32 76 18 56 58]
 [ 2 16 65 69 34]
 [53 28 87 41 29]
 [11 53 61 39  7]
 [30 92 87 79 52]]
'''

uniform函数:

import numpy as np

# np.set_printoptions(precision=2)控制产生的随机数的小数位数
np.set_printoptions(precision=2)

# 产生给定范围且均匀分布的数
a = np.random.uniform(low=0, high=50, size=[5,5])
print(a)
'''
 [42.87 37.03 25.68 44.84 47.42]
 [ 0.42 25.04 23.32 39.87 17.56]
 [47.16 37.28  4.26 38.17 31.47]
 [ 8.77 40.19 12.89 36.89 46.85]]
'''

normal函数:(正态分布)

import numpy as np

# 产生10个均值为1,标准差为3的数字
a = np.random.normal(1, 3, size=10)
# print(a)
# >>> [-3.90475112  3.10656401 -0.65542231 -1.18732134  3.69875681  0.9381126 1.25147991  1.04354389 -0.64479801  0.30947606]

# 查看产生的均值
print(np.mean(np.random.normal(1, 3, size=10000)))

# 查看产生的标准差
print(np.std(np.random.normal(1, 3, size=10000)))

randn函数:

import numpy as np

# randn()产生标准正态分布随机数
print(np.random.randn(10, 2))
'''
[[-0.52965208 -1.05684052]
 [ 0.488091   -1.30885924]
 [-0.57514636 -0.43549027]
 [-1.07452458  0.3166585 ]
 [-0.09775564  1.06311644]
 [-0.6850656  -0.88613022]
 [ 0.02777025 -0.89569731]
 [-1.1285278   1.21297933]
 [ 0.16932239 -1.05238369]
 [-0.66562821 -0.49166847]]
'''

shuffle函数:

import numpy as np

# shuffle() 对数组中的数据随机排序输出,但是原数组也会发生改变
a = np.array([1,2,3,4,5,6])
np.random.shuffle(a)
print(a)
# >>> [3 4 6 5 1 2]

# permutation() 对数组中的数据随机排序输出,但是原数组不会发生改变
b = np.array([1,2,3,4,5,6])
s = np.random.permutation(b)
print(s)
# >>> [4 1 3 6 2 5]

print(b)
# >>> [1 2 3 4 5 6]

(2)Numpy统计相关函数

arr.txt文档数据(以下代码会用)

1,2,3,4,5,6
2,3,4,5,6,7
3,4,5,6,7,8
4,5,6,7,8,9
5,6,7,8,9,10
6,7,8,9,10,11
7,8,9,10,11,12
8,9,10,11,12,13
9,10,11,12,13,14
10,11,12,13,14,15
11,12,13,14,15,16
import numpy as np

data = np.genfromtxt('arr.txt', delimiter=',', skip_header=0, encoding='utf-8')
# 如果需要跳过首行,使用语法skip_header(1)
print(data)                 # 打印数据
# print(data.shape)           # data.shape求数据的行列数
# print(data.sum())           # data.sum() 求和计算

# print(data.sum(axis=0))     # axis=0 计算每一列加起来的值
# print(data.sum(axis=1))     # axis=1 计算每一行加起来的值
#
# print(data.mean(axis=0))     # axis=0 计算每一列的平均值
# print(data.mean(axis=1))     # axis=1 计算每一行的平均值

# print(data.cumsum())              # cumsum()对整个数据表进行累加
# print(data.cumsum(axis=0))      # cumsum(axis=0)对每一列进行累加
# print(data.cumsum(axis=1))      # cumsum(axis=1)对每一行进行累加

# print(data.cumprod())           # cumprod()累乘
# print(data.cumprod(axis=0))
# print(data.cumprod(axis=1))

# print(data.max())                  # 计算最大值
# print(data.min())                  # 计算最小值

# print(np.ptp(data))                   # np.ptp(data)求极差(数据中的最大值 — 最小值)
#
# print(np.percentile(data,5))         # 计算中位数

# print(data > 5)                 # 统计数据中大于5的值,如果是返回True,否则返回Flase

# print(np.sum(data > 5))           # 统计数据中大于5的值的个数

(3)Numpy线性代数

A   了解线性代数

数组相乘:

import numpy as np

a = np.array([1,2,3])
b = np.array([4,5,6])
vector_dot = np.dot(a, b)
print(vector_dot)
# >>> 32

arr1 = np.array([5,15,25,40]).reshape(4,1)
arr2 = np.arange(12).reshape(3,4)

arr2d = np.dot(arr2, arr1)
print(arr2d)
'''
[[185]
 [525]
 [865]]
'''
import numpy as np

arr3 = np.array([[1,2],[3,4]])
print(arr3)
'''
[[1 2]
 [3 4]]
'''
arr4 = np.array([[4,5],[6,7]])
print(arr4)
'''
[[4 5]
 [6 7]]
'''

print(arr3 * arr4)
'''
[[ 4 10]
 [18 28]]

矩阵乘法:

import numpy as np

arr3 = np.array([[1,2],[3,4]])
print(arr3)
'''
[[1 2]
 [3 4]]
'''
arr4 = np.array([[4,5],[6,7]])
print(arr4)
'''
[[4 5]
 [6 7]]
'''
# 矩阵乘法
c = np.dot(arr3, arr4)
print(c)
'''
[[16 19]
 [36 43]]
'''

B    了解矩阵的转置和求逆

矩阵转置:

import numpy as np

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

# 矩阵转置(X轴变Y轴,Y轴变X轴)
print(np.transpose(arr3))
'''
[[1 5 4 6]
 [2 6 3 8]
 [3 7 5 3]
 [4 8 7 6]]
'''
print(arr3.shape)      # 查看数据结构

矩阵求逆:

import numpy as np

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

# 矩阵求逆
arr3_inv = np.linalg.inv(arr3)
print(arr3_inv)
'''
[[-7.50000000e-01  8.33333333e-02  3.33333333e-01 -3.70074342e-17]
 [ 2.81250000e-01  9.37500000e-02 -3.75000000e-01  1.25000000e-01]
 [-3.12500000e-01  5.62500000e-01 -2.50000000e-01 -2.50000000e-01]
 [ 5.31250000e-01 -4.89583333e-01  2.91666667e-01  1.25000000e-01]]
'''

C   多元一次方程求解

(由于多元一次方程求解在实际中不常用到,所以笔记就没有做。如果有相关需求的可以留言评论告知我,我看到后会进行更新补充。)

猜你喜欢

转载自blog.csdn.net/weixin_44940488/article/details/106445557