当前位置: 首页 > news >正文

31 数据分析(中)numpy介绍

文章目录

  • 工具
    • excel
    • Tableau
    • Power Query
    • jupyter
    • matplotlib
    • numpy
      • 安装
      • 导入包
      • 快速掌握(bushi)
        • array和list的相互转化
      • np的range
      • 多维数组的属性
      • array的改变形状
      • array升降维度
      • array内元素的类型
      • 数和array的运算
      • array之间的加减法
      • 认识轴
      • 切片
      • 条件与逻辑
      • 修改值
      • append
      • insert
      • delete
      • unique
      • 最大最小值运算
      • 前缀和和平均值
      • 其他的数学函数,基本理解都和上面一样
      • array 拼接
      • array 分割
      • nan介绍
      • inf
      • 转置
      • copy
      • 常用接口总结
      • 导入数据
        • 最简单的接口
        • 基础的读取数据-----从txt当中读取
        • 有筛选的读取数据------从csv当中读取
      • np.random模块
    • pandas

工具

excel

Tableau

Power Query

jupyter

见个人链接:30 数据分析(上)链接

matplotlib

见个人链接:30 数据分析(上)链接

numpy

numpy实际上是用于科学计数的一个库,底层是使用c进行实现的,在学习tensor之前建议都先学习一遍numpy这个库,Numpy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组。Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。

安装

pip install numpy

导入包

import numpy as np

快速掌握(bushi)

array和list的相互转化
# list转化为nparray   方法 np.array
list1 = [1,2,3,4]
print(list1)
oneArray = np.array(list1) 
print(type(oneArray)) 
print(oneArray)
print('*'*50)# list转化为nparray 方法1 list
t2 = np.array(range(10))
print(t2) 
print(type(t2))
print(list(t2))  #list转回列表
print('*'*50)# list转化为nparray 方法2 np.tolist
t2 = np.array(range(10))
print(t2.tolist())
print('*'*50)

输出:

[1, 2, 3, 4]
<class 'numpy.ndarray'>
[1 2 3 4]
**************************************************
[0 1 2 3 4 5 6 7 8 9]
<class 'numpy.ndarray'>
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
**************************************************
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
**************************************************

python list打印出来的元素之间有逗号,而ndarray是空格。

np的range

#np自带arange
t3 = np.arange(0,10,2)
print(t3) 
print(type(t3))

输出:

[0 2 4 6 8]
<class 'numpy.ndarray'>

多维数组的属性

# 多维数组的属性
Array = np.array([[1,2],[3,4],[5,6]])
# 获取数组长的什么样子
print(Array)
# 获取数组的维度( 注意: 与函数的参数很像) 
print(Array.ndim)
# 形状(行,列)
print(Array.shape)
# 有多少个元素
print(Array.size)

输出:

[[1 2][3 4][5 6]]
2
(3, 2)
6

array的改变形状

array1 = np.array([[1,2,3],[4,5,6]])
array2 = np.array([[1,2,3],[4,5,6]])
print(array1)
print('*'*50)# 修改形状方法1 修改了本身的array
array1.shape = (3,2)
print(array1)
print('*'*50)# 修改形状方法2 没有修改本身的array
re_array2 = array2.reshape(3,2)
print(array2)
print(re_array2)
print('*'*50)

输出:

[[1 2 3][4 5 6]]
**************************************************
[[1 2][3 4][5 6]]
**************************************************
[[1 2 3][4 5 6]]
[[1 2][3 4][5 6]]
**************************************************

array升降维度

array1 = np.array([[1,2,3],[4,5,6]])
print(array1)
print(array1.ndim)
print('*'*50)# 通用的升降维方式
re_array1 = array1.reshape(6)
print(re_array1)
print(re_array1.ndim)
re_array1 = array1.reshape(1,2,3)
print(re_array1)
print(re_array1.ndim)
print('*'*50)# 将多维变成一维数组
fla_array1 = array1.flatten()
print(fla_array1)
print('*'*50)

输出:

[[1 2 3][4 5 6]]
2
**************************************************
[1 2 3 4 5 6]
1
[[[1 2 3][4 5 6]]]
3
**************************************************
[1 2 3 4 5 6]
**************************************************

array内元素的类型

指定dtype的目的是减少内存的使用,提高运算效率

整数:

# np.int8到np.int64   16就是16bits
array = np.array([1,2,3,4,5], dtype = np.int16) # 返回数组中每个元素的字节单位长度,dtype设置数据类型
# itemsize 输出的就是所占的字节数
print(array.itemsize)
# 获取数据类型
print(array.dtype)# 修改数据类型
array = array.astype(np.int64) 
print(array.dtype)
print(array.itemsize) 

输出:

2
int16
int64
8

小数:

import random
# 随机生成小数# 使用python语法,round是保留多少位
print(random.random())
print(round(random.random(),2))
print('-'*50)array = np.array([random.random() for i in range(10)])
print(array)
print(array.itemsize)
print(array.dtype)
print('-'*50)array1 = array.astype(np.float32)
print(array1)
#float32精度为6-7位
#double(float64)精度是15-16位# 取小数点后两位,np.round可以把所有的元素都变成2位有效数字
print(np.round(array,2))

输出:

0.979209849421405
0.26
--------------------------------------------------
[0.3763924  0.32276703 0.4589791  0.15596424 0.37418283 0.173525110.61259661 0.35300061 0.10490647 0.7840607 ]
8
float64
--------------------------------------------------
[0.3763924  0.32276702 0.4589791  0.15596424 0.37418282 0.173525110.61259663 0.3530006  0.10490647 0.7840607 ]
[0.38 0.32 0.46 0.16 0.37 0.17 0.61 0.35 0.1  0.78]

数和array的运算

array = np.arange(6).reshape((2,3))
print(array)
print("-"*50)# array可以与整数进行加减乘除
print(array+2) 
print(array-2)
print(array*2) 
print(array/2)
print(array//2)

输出:

[[0 1 2][3 4 5]]
--------------------------------------------------
[[2 3 4][5 6 7]]
[[-2 -1  0][ 1  2  3]]
[[ 0  2  4][ 6  8 10]]
[[0.  0.5 1. ][1.5 2.  2.5]]
[[0 0 1][1 2 2]]

array之间的加减法

形状相同之间的运算:

t1 = np.arange(0,6).reshape((2,3))
t2 = np.arange(100,106).reshape((2,3))
print(t1)
print(t2)
print('-'*50)
print(t1+t2) 
print(t1*t2)  #是否是矩阵乘法? 不是,是对应位置相乘

输出:

[[0 1 2][3 4 5]]
[[100 101 102][103 104 105]]
--------------------------------------------------
[[100 102 104][106 108 110]]
[[  0 101 204][309 416 525]]

形状不相同之间的运算,只有部分可行:

#一维数组和二维数组进行运算时,一维的元素个数和列数相等
t1 = np.arange(24).reshape((4,6)) 
t2 = np.arange(0,6)
print(t1)
print(t2)
print('-'*50)t2=t2.reshape((1,6))
print(t2)
# np.sum(array)函数就是把内部所有的元素相加得到一个值,然后返回
print(np.sum(t2))
print(t2.shape)
print(t1-t2)

输出:

[[ 0  1  2  3  4  5][ 6  7  8  9 10 11][12 13 14 15 16 17][18 19 20 21 22 23]]
[0 1 2 3 4 5]
--------------------------------------------------
[[0 1 2 3 4 5]]
15
(1, 6)
[[ 0  0  0  0  0  0][ 6  6  6  6  6  6][12 12 12 12 12 12][18 18 18 18 18 18]]
t1 = np.arange(24).reshape((4,6)) 
t2 = np.arange(4).reshape((4,1))
print(t2)
print(t1)
print('-'*50)
print(t1-t2)

输出:

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

认识轴

轴是从0,1,2,3,4······开始的
0对应的就是第一层括号,1就是第二层括号,沿轴就是将这个括号去掉,然后相运算

array1 = np.array([[1,2,3],[4,5,6]])
print(array1)
print('-'*50)print(np.sum(array1,axis=0))
print(np.sum(array1,axis=1))
print("-"*50)# 思维提升 四维测试
array2=np.arange(24).reshape((1,2,3,4))
print(array2)
print(np.sum(array2,axis=1))
print(np.sum(array2,axis=1).shape)
print('-'*50)

输出:

[[1 2 3][4 5 6]]
--------------------------------------------------
[5 7 9]
[ 6 15]
--------------------------------------------------
[[[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]][[12 13 14 15][16 17 18 19][20 21 22 23]]]]
[[[12 14 16 18][20 22 24 26][28 30 32 34]]]
(1, 3, 4)
--------------------------------------------------

切片

array = np.arange(12).reshape(4,3)
print(array)
print('-'*50)# 取其中一行
print(array[1]) 
print('-'*50)# 切片 取连续多行
print(array[1:])
print('-'*50)# 切片 取连续的多行
print(array[1:3,:])
print('-'*50)# 取不连续的多行
print(array[[0,3]])
print('-'*50)# 取不连续的多行
print(array[[0,2,3],:])
print('-'*50)# 取一列
print(array[:,1])
print('-'*50)# 连续的多列
print(array[:,1:])
print('-'*50)# 取不连续的多列
print(array[:,[0,2]])
print('-'*50)# 取某一个值,三行四列  py是t1[2][1]
print(array[2,1]) 
print('-'*50)# 取多个连续的值 行列的连续
print(array[1:3,1:3])
print('-'*50)# 取多个不连续的值,[[行,行。。。],[列,列。。。]]
print(t1[[0,1,1],[0,1,3]])

输出:

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

条件与逻辑

# 条件 与 逻辑
array = np.arange(6).reshape(2,3)
print(array)
print('-'*20)# 条件 逻辑与:&  逻辑或|  逻辑非~
print(array[(array>1)&(array<4)])
print('-'*20)

输出:

[[0 1 2][3 4 5]]
--------------------
[2 3]
--------------------

修改值

array1 = np.arange(12).reshape(3,4)
array2 = np.arange(12).reshape(3,4)
array3 = np.arange(12).reshape(3,4)
array4 = np.arange(12).reshape(3,4)
print(array1)
print('-'*20)# 切片修改值
array1[1:3,1:3]=0
print(array1)
print('-'*20)# 条件修改值
array2[~(array2>4)]=0
print(array2)
print('-'*20)# clip函数修改
# np.clip(array,num1,num2)  就是在这个array当中元素小于num1的都修改成num1,大于num2的都修改成num2
array3 = np.clip(array3,5,10)
print(array3)
print('-'*20)# where函数的修改 
# np.where(condition, x, y)满足条件(condition),输出x,不满足输出y。)
array4 = np.where(array4<7,True,False)
print(array4)
print('-'*20)

输出:

[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]]
--------------------
[[ 0  1  2  3][ 4  0  0  7][ 8  0  0 11]]
--------------------
[[ 0  0  0  0][ 0  5  6  7][ 8  9 10 11]]
--------------------
[[ 5  5  5  5][ 5  5  6  7][ 8  9 10 10]]
--------------------
[[ True  True  True  True][ True  True  True False][False False False False]]
--------------------

append

# numpy.append 函数在数组的末尾添加值。 追加操作会分配整个数组,并把原来的数组复制到新数组中。
# 此外,输入数组的维度必须匹配,否则将生成ValueError。
array = np.array([[1, 2, 3], [4, 5, 6]])
print(array)
print('-'*20)# 添加一行
print(np.append(array, [7, 8, 9]))
print('-'*20)# 沿轴 0 添加元素  这边可以看出(2,3)添加需要(1,3)
print(np.append(array, [[7, 8, 9]], axis=0))
print('-'*20)# 沿轴 1 添加元素  这边可以看出(2,3)添加需要(2,2),小的总结一下添加哪一维度,那一个维度才可以不同,剩下的都需要相同
print(np.append(array, [[5, 5], [7, 8]], axis=1))
print('-'*20)

输出:

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

当处于高纬度的时候,我们更希望知道的是shape是否是按照我们的想法进行扩展,而不关注内部的数据,因为数据呵呵,当处于高维的时候,我们是没有办法进行想象,像人工智能下的tensor张量,基本我见过的最多达到5阶,那已经是没有办法进行查看了,这边给出三维度的相加,看一下:(实际上就是对应维度相加)

array = np.arange(24).reshape(2,3,4)
print(array.shape)# axios=0 (2,3,4)+(1,3,4) = (3,3,4)
print(np.append(array,[[[1,2,3,4],[5,6,7,8],[9,10,11,12]]],axis=0).shape)# axios=1 (2,3,4)+(2,2,4) = (2,5,4)
print(np.append(array,[[[1,2,3,4],[5,6,7,8]],[[5,6,7,8],[9,10,11,12]]],axis=1).shape)# axios=2 (2,3,4)+(2,3,1) = (2,3,5)
print(np.append(array,[[[1],[2],[3]],[[4],[5],[6]]],axis=2).shape)
(2, 3, 4)
(3, 3, 4)
(2, 5, 4)
(2, 3, 5)

insert

# numpy.insert
# 函数在给定索引之前,沿给定轴在输入数组中插入值。# 如果值的类型转换为要插入,则它与输入数组不同。
# 插入没有原地的,函数会返回一个新数组。 此外,如果未提供轴,则输入数组会被展开。array = np.arange(6).reshape(3,2)
print(array)
print(array.shape)
print('-'*20)print(np.insert(array,1, [11, 12]))
print(np.insert(array,1, [11, 12]).shape)
print('-'*20)# 沿轴0广播
print(np.insert(array,1, [11, 12],axis=0))
print(np.insert(array,1, [11, 12],axis=0).shape)
print('-'*20)# 沿轴1广播
print(np.insert(array, 1, 11, axis=1))
print(np.insert(array, 1, 11, axis=1).shape)

输出:

[[0 1][2 3][4 5]]
(3, 2)
--------------------
[ 0 11 12  1  2  3  4  5]
(8,)
--------------------
[[ 0  1][11 12][ 2  3][ 4  5]]
(4, 2)
--------------------
[[ 0 11  1][ 2 11  3][ 4 11  5]]
(3, 3)

三维查看:

array = np.arange(24).reshape(2,3,4)
print(array.shape)
print('-'*20)
# (2, 3, 4)+11=(3, 3, 4)
print(np.insert(array,1,11,axis=0).shape)
print(np.insert(array,1,11,axis=0))
print('-'*20)
# (2, 3, 4)+(2,4)=(2, 4, 4)
print(np.insert(array,1,[[1,2,3,4],[5,6,7,8]],axis=1).shape)
print(np.insert(array,1,[[1,2,3,4],[5,6,7,8]],axis=1))
print('-'*20)print(np.insert(array,1,[[1,2,3],[4,5,6]],axis=2).shape)
print(np.insert(array,1,[[1,2,3],[4,5,6]],axis=2))
print('-'*20)

输出:

(2, 3, 4)
--------------------
(3, 3, 4)
[[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]][[11 11 11 11][11 11 11 11][11 11 11 11]][[12 13 14 15][16 17 18 19][20 21 22 23]]]
--------------------
(2, 4, 4)
[[[ 0  1  2  3][ 1  2  3  4][ 4  5  6  7][ 8  9 10 11]][[12 13 14 15][ 5  6  7  8][16 17 18 19][20 21 22 23]]]
--------------------
(2, 3, 5)
[[[ 0  1  1  2  3][ 4  2  5  6  7][ 8  3  9 10 11]][[12  4 13 14 15][16  5 17 18 19][20  6 21 22 23]]]
--------------------

delete

具体多维的理解和insert一致,就是对应维度的shape-1,或者说对应维度的元素num剪掉

#numpy.delete 函数返回从输入数组中删除指定子数组的新数组。 与 insert() 函数的情况一样,
# 如果未提供轴参数, 则输入数组将展开。
array = np.arange(2,14).reshape(3,4)
print(array)
print(array.shape)
print('-'*20)print(np.delete(array,5))
print(np.delete(array,5).shape)
print('-'*20)print(np.delete(array,1,axis = 0))
print(np.delete(array,1,axis = 0).shape)
print('-'*20)print(np.delete(array,2,axis = 1))
print(np.delete(array,2,axis = 1).shape)
print('-'*20)

输出:

[[ 2  3  4  5][ 6  7  8  9][10 11 12 13]]
(3, 4)
--------------------
[ 2  3  4  5  6  8  9 10 11 12 13]
(11,)
--------------------
[[ 2  3  4  5][10 11 12 13]]
(2, 4)
--------------------
[[ 2  3  5][ 6  7  9][10 11 13]]
(3, 3)
--------------------

unique

# numpy.unique 函数用于去除数组中的重复元素,并且进行排序
array = np.array([5,2,6,2,7,5,6,9,8,2])
print (array)
print('-'*20)#去除重复元素,输出的是有序序列
print (np.unique(array))
print('-'*20)# 去重数组的索引数组
u,indices = np.unique(array, return_index = True)
print(u)
print (indices)
print('-'*20)# 我们可以看到每个和原数组下标对应的数值
# 去重数组的下标
u,indices = np.unique(array,return_inverse = True)
print (u)
print (indices)
print('-'*20)# 返回去重元素的重复数量
u,indices = np.unique(array,return_counts = True)
print (u)
print (indices)

带上轴的

np.unique(np.array([[1, 0, 0], [1, 0, 0], [2, 0, 0]]), axis=1)
"""
array([[0, 1],[0, 1],[0, 2]])
"""

最大最小值运算

array = np.array([[80,88],[82,81],[75,81]])
print(array)# 获取所有数据最大值,最小值
print(np.max(array))
print(np.min(array))
print('-'*20)# 获取某一个轴上的数据最大值
print(np.max(array,axis=1))
print(np.min(array,axis=0))
print('-'*20)# 数据的比较
# 第一个参数中的每一个数与第二个参数比较返回大的
print(np.maximum(np.arange(-2,3), 0 ))
# 第一个参数中的每一个数与第二个参数比较返回小的
print(np.minimum(np.arange(-2,3), 0 ))
print('-'*20)# argmin求最小值索引
print(array)
print(np.argmax(array,axis=0))
print(np.argmin(array))

输出:

[[80 88][82 81][75 81]]
88
75
--------------------
[88 82 81]
[75 81]
--------------------
[0 0 0 1 2]
[-2 -1  0  0  0]
--------------------
[[80 88][82 81][75 81]]
[1 0]
4

前缀和和平均值

array = np.arange(6).reshape(2,3)
print(array)
print('-'*20)# 求平均值
print(np.mean(array))
print(np.mean(array,axis=1))
print('-'*20)# 求前缀和
print(array.cumsum(0))
'''
[0, 1, 2]------>	|0	|1	|2	|
[3, 4, 5]------>	|3=3+0 |5=1+4 |7=5+2|
'''
print(array.cumsum(1))

输出:

[[0 1 2][3 4 5]]
--------------------
2.5
[1. 4.]
--------------------
[[0 1 2][3 5 7]]
[[ 0  1  3][ 3  7 12]]

其他的数学函数,基本理解都和上面一样

直接去看结论,有剩下的函数

array 拼接

# 有的时候我们需要将两个数据加起来一起研究分析,我们就可以将其进行拼接然后分析
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])# 要求a,b两个数组的维度相同
# 沿轴 0 连接两个数组
print (np.concatenate((a,b),axis= 0))
# 沿轴 1 连接两个数组
print (np.concatenate((a,b),axis = 1))
print('-'*20)# 升维度相加
print(np.stack((a,b),axis=0))
print(np.stack((a,b),axis=1))
print(np.stack((a,b),axis=-1))
print('-'*20)# 水平相加
v1 = [[0,1,2,3,4,5],[6,7,8,9,10,11]]
v2 = [[12,13,14,15,16,17],[18,19,20,21,22,23]]
print(np.vstack((v1,v2)))
print('-'*20)# 垂直相加
v1 = [[0,1,2,3,4,5],[6,7,8,9,10,11]]
v2 = [[12,13,14,15,16,17],[18,19,20,21,22,23]]
print(np.hstack((v1,v2)))

输出:

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

array 分割

# 1. 将一个数组分割为多个子数组
'''
参数说明:
ary:被分割的数组
indices_or_sections:是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭)
axis:沿着哪个维度进行切向,默认为0,横向切分。为1时,纵向切分
'''
array = np.arange(6).reshape(2,3)
print(array)
print('-'*20)print (np.split(array,2))
print (np.hsplit(array,1))
print (np.hsplit(array,3))
print (np.vsplit(array,1))
print (np.vsplit(array,2))
print('-'*20)

输出:

[[0 1 2][3 4 5]]
--------------------
[array([[0, 1, 2]]), array([[3, 4, 5]])]
[array([[0, 1, 2],[3, 4, 5]])]
[array([[0],[3]]), array([[1],[4]]), array([[2],[5]])]
[array([[0, 1, 2],[3, 4, 5]])]
[array([[0, 1, 2]]), array([[3, 4, 5]])]

nan介绍

# nan可以当成空  inf就当成无限大,不过在计算的时候记得分为正无限大和负无限大
nan = np.nan  #nan代表not a number,不是数值,从文档中读取数值时,读取了空
inf = np.inf
array = np.arange(12,dtype=np.float32).reshape(3,4)
array[1,2]=nan
array[2,3]=nan
print(array)
print('-'*20)# 统计nan的数量 np.count_nonzero(array)统计的是array当中的0的个数,需要注意的是 nan!=nan ,而array当中的其他元素都和自己本身相等,所以就可以用这个来进行判断
print(np.count_nonzero(array != array))
print('-'*20)# 返回一个是否是nan的数组
print(np.isnan(array))
print('-'*20)# 把nan变成0
array1 = array
array1[array1!=array1]=0
print(array1)

输出:

[[ 0.  1.  2.  3.][ 4.  5. nan  7.][ 8.  9. 10. nan]]
--------------------
2
--------------------
[[False False False False][False False  True False][False False False  True]]
--------------------
[[ 0.  1.  2.  3.][ 4.  5.  0.  7.][ 8.  9. 10.  0.]]

看一下是否能看得懂:

array = np.arange(24).reshape(4,6).astype(np.float32)
print(array)# 将数组中的一部分替换nan
array[1:3,1:5] = np.nan
print(array)
print('-'*20)print(array.shape)
# 遍历每一列,然后判断每一列是否有nan, column
for i in range(array.shape[1]):#获取当前列数据temp_col = array[:,i]# 判断当前列的数据中是否含有nannan_num = np.count_nonzero(temp_col != temp_col)# 条件成立说明含有nanif nan_num != 0:# 将这一列不为nan的数据拿出来temp_col_not_nan = temp_col[temp_col == temp_col]print(temp_col_not_nan)# 将nan替换成这一列的平均值temp_col[np.isnan( temp_col )] = np.mean( temp_col_not_nan )print(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.]]
[[ 0.  1.  2.  3.  4.  5.][ 6. nan nan nan nan 11.][12. nan nan nan nan 17.][18. 19. 20. 21. 22. 23.]]
--------------------
(4, 6)
[ 1. 19.]
[ 2. 20.]
[ 3. 21.]
[ 4. 22.]
[[ 0.  1.  2.  3.  4.  5.][ 6. 10. 11. 12. 13. 11.][12. 10. 11. 12. 13. 17.][18. 19. 20. 21. 22. 23.]]

还有就是任何数据和nan计算都是nan

inf

  1. 对于inf只需要知道无限大有分正无限和负无限大
  2. 无限大等于无限大
  3. 1/0=无限大

转置

#对换数组的维度
array = np.arange(6).reshape(2,3)
print (array)
print('-'*20)# 转置 T和np.transpose是一样的  多维转置(1,2,3)-> (3,2,1)全反
print (np.transpose(array))
print(array.T)
print('-'*20)# 函数用于交换数组的两个轴
print(np.swapaxes(array,0,1))
print('-'*20)# 其实对于机器学习来说我们仅仅需要看shape
array = np.arange(6).reshape(1,2,3)
print(np.shape(array))
print(np.shape(np.transpose(array)))
print(np.shape(np.swapaxes(array,0,1)))
print('-'*20)# 轴滚动
a = np.ones((3,4,5,6))
print(np.rollaxis(a, 3,start=0).shape)

输出:

[[0 1 2][3 4 5]]
--------------------
[[0 3][1 4][2 5]]
[[0 3][1 4][2 5]]
--------------------
[[0 3][1 4][2 5]]
--------------------
(1, 2, 3)
(3, 2, 1)
(2, 1, 3)
--------------------
(6, 3, 4, 5)

copy

就如下,就不解释了。。。。

array1=array2.copy()

常用接口总结

接口说明
np.array(list,detype)把list转化为array,参数list常用列表,也可以是其他的可迭代对象,detype参数可写,写的就是内部元素的类型
list(array)把array转化为list,参数array就是array,将之转化为list列表,这个接口是改变本array
array.tolist()这个接口返回array的list形式,这个接口是返回一个新的list对象,而原本的array还是array,和上面的相对比
np.arange(num1,num2,num3)和range的使用方式一样,num1就是起始位置(闭区间),num2就是结束位置(开区间),num3就是步长
array.ndim查看数组的维度
array.shape查看数组的形状,然后这个值可供赋值操作,可以赋值为一个元组,例如(3,2)
array.size查看数组总共元素的多少
array.reshape()修改数组的形状,同样也可以升降维
array1.flatten()直接拉长,变成一维
array.itemsizeitemsize 输出的就是所占的字节数
array.dtype元素的属性
array.astype(np.对应元素的属性,如np.float64)修改元素的属性,需要关注的是截断
np.round(array,num)返回array数组,当中的每一个元素都进行四舍五入,四舍五入的位数和num相关
random.random()返回的是0-1之间的小数(np.float64)
np.sum(array,axis)array返回累加值,axis就是轴,沿哪一个轴的方向相加
切片见上,这边没办法总结
np.clip(array,num1,num2)就是在这个array当中元素小于num1的都修改成num1,大于num2的都修改成num2
np.where(condition, x, y)满足条件(condition),输出x,不满足输出yarr输入数组 values 要向arr添加的值,需要和arr形状相同(除了要添加的轴)axis 默认为None。当axis无定义时,是横向加成,返回总是为一维数组!当axis有定义的时候,分别为0和1的时候。当axis有定义的时候,分别为0和1的时候(列数要相同)。当axis为1时,数组是加在右边(行数要相同)。
np.append(array, list, axis)
np.insert(array,1, 元素,axis)不指定axis就是一维拉长相加,元素如果选常数,就是每一层都相加,元素如果是选列表,数目就需要和array一致,1就是插入的位置,array就是数组
np.delete(array,1,axis)arr: 输 入 数 组obj:可以被切片,整数或者整数数组,表明要从输入数组删除的子数组axis:沿着它删除给定子数组的轴,如果未提供,则输入数组会被展开
np.unique(array,return的参数,axis)arr:输入数组,如果不是一维数组则会展开,return_index:如果为true,返回新列表元素在旧列表中的位置(下标),并以列表形式储,return_inverse:如果为true,返回旧列表元素在新列表中的位置(下标),并以列表形式储,return_counts:如果为true,返回去重数组中的元素在原数组中的出现次数,axis就是删除第几维的数据,此时元素按照
np.max(array,axis)求取某一个轴上的最大值,如果不写axis,就是展开一维,看所有数值的最大值
np.min(array,axis)与上相反
np.maximum(array, 0 )把array当中小于0的数都变成0
np.minimum(array, 0 )与上相反
np.argmax(array,axis)寻找array中的选定轴的最大值的索引
np.argmin(array,axis)与上相反
np.mean(array,axis)算出所选定轴的平均数
array.cumsum(axis)算出所选定轴的前缀和
numpy.sqrt(array)平方根函数
numpy.exp(array)e^array[i]的数组
numpy.abs/fabs(array)计算绝对值
numpy.square(array)计算各元素的平方 等于array 2
numpy.log/log10/log2(array)计算各元素的各种对数
numpy.sign(array)计算各元素正负号
numpy.isnan(array)计算各元素是否为NaN
numpy.isinf(array)计算各元素是否为NaN
numpy.cos/cosh/sin/sinh/tan/tanh(array)三角函数
numpy.modf(array)将array中值得整数和小数分离,作两个数组返回
numpy.ceil(array)向上取整,也就是取比这个数大的整数
numpy.floor(array)向下取整,也就是取比这个数小的整数
numpy.rint(array)四舍五入
numpy.trunc(array)向0取整
numpy.add(array1,array2)元素级加法
numpy.subtract(array1,array2)元素级减法
numpy.multiply(array1,array2)元素级乘法
numpy.divide(array1,array2)元素级除法 array1./array2
numpy.power(array1,array2)元素级指数 array1.^array2
numpy.maximum/minimum(array1,aray2)元素级最大值
numpy.fmax/fmin(array1,array2)元素级最大值,忽略NaN
numpy.mod(array1,array2)元素级求模
numpy.copysign(array1,array2)将第二个数组中值得符号复制给第一个数组中值
numpy.greater/greater_equal/less/less_equal/equal/not_equal (array1,array2)元素级比较运算,产生布尔数组
numpy.logical_end/logical_or/logic_xor(array1,array2)元素级的真值逻辑运算
np.concatenate((array1,array2),axis)沿选定轴方向进行拼接,除维度外的shape都需要一样
np.stack((array1,array2),axis)升维度进行拼接,不过需要注意的是,这个的前后的,需要维度形状都一样
np.concatenate((array1,array2),axis)沿axis方向的array的array相加
np.vstack((array1,array2))水平元素相加
np.hstack((array1,array2))垂直元素相加
np.split(array,num,axios)沿轴方向分割数组数组
np.vsplit(array,indices_or_sections)array:被分割的数组,indices_or_sections:是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭)axis:沿着哪个维度进行切向,默认为0,横向切分。为1时,纵向切分
np.vsplit(array,indices_or_sections)上面是水平,这边是竖直方向上
np.count_nonzero(array)统计非零的数目
np.nannull
np.inf无限大
np.transpose(array)逆序倒置他的shape
np.T同上
np.swapaxes(array,0,1)交换两个轴
np.rollaxis(array, num2,start=num1)轴滚动,就是把num2和num1进行调换,需要注意的是只有num2>num1才会执行
array1=array2.copy()实际上就是后者是前者的一个copy,他们的id不一样

导入数据

最简单的接口
直接np.load()
和np.save()读取的是npy文件,这边就不介绍了
基础的读取数据-----从txt当中读取

np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,
usecols=None,unpack=False)

在这里插入图片描述
unpack就是转置,一般不要使用,这样子才是一个括号内,包含这个事物的所有特征

数据number.txt
在这里插入图片描述
基础的读取数据(从txt当中读取):

number_path = './archive/number.txt'
# delimiter是分隔符,一般是unpack为false,一列为一个特征
t1 = np.loadtxt(number_path,delimiter=",",dtype="int",unpack=True,encoding='utf8')
t2 = np.loadtxt(number_path,delimiter=",",dtype="int",encoding='utf8')print(t1)
print(t2)

输出:

[[ 1  6][ 2  7][ 3  8][ 4  9][ 5 10]]
[[ 1  2  3  4  5][ 6  7  8  9 10]]
有筛选的读取数据------从csv当中读取

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

num_path = './archive/num.csv't_gb_video = np.loadtxt(num_path,dtype='int64',delimiter=',',skiprows=1,usecols=(0,2,3),encoding='utf8')print(t_gb_video)

输出:

[[    1    22 11111][    2    21 22222][    3    20 33333][    4    22 44444][    5    21 55555]]

np.random模块

在这里插入图片描述

array1 = np.random.rand(2,3)
print(array1)
print('-'*20)array2 = np.random.randn(2,3)
print(array2)
print('-'*20)array3 = np.random.randint(1,5,(2,3))
print(array3)
print('-'*20)array4 = np.random.uniform(0.0,1.0,(2,3))
print(array4)

输出:

[[0.81889905 0.22799652 0.95090655][0.25433465 0.76184529 0.92012839]]
--------------------
[[-1.37504485  0.64581416 -1.25324539][ 0.22773263 -1.15448029 -0.51791998]]
--------------------
[[2 2 1][1 2 4]]
--------------------
[[6.47574634 4.56261091 1.04990935][7.38037415 4.28771509 1.83393943]]
--------------------

pandas

见32 数据分析(下):

相关文章:

31 数据分析(中)numpy介绍

文章目录 工具excelTableauPower Queryjupytermatplotlibnumpy安装导入包快速掌握&#xff08;bushi&#xff09;array和list的相互转化 np的range多维数组的属性array的改变形状array升降维度array内元素的类型数和array的运算array之间的加减法认识轴切片条件与逻辑修改值app…...

华为OD机考算法题:字符串划分

题目部分 题目字符串划分难度难题目说明给定一个小写字母组成的字符串s&#xff0c;请找出字符串中两个不同位置的字符作为分割点&#xff0c;使得字符串分成的三个连续子串且子串权重相等&#xff0c;注意子串不包含分割点。 若能找到满足条件的两个分割点&#xff0c;请输出…...

AF_UNIX和127.0.0.1(AF_INET)回环地址写数据速度对比(二)

之前写了篇博客&#xff1a;AF_UNIX和127.0.0.1(AF_INET)回环地址写数据速度对比 然后利用的是发送端读取大文件&#xff0c;接收方接收并保存为文件的方式进行测试&#xff0c;结果发现&#xff0c;AF_UNIX并未比127.0.0.1(AF_INET)回环地址优秀&#xff0c;若单次发送的字节数…...

“Python+”集成技术高光谱遥感数据处理与机器学习教程

详情点击公众号链接&#xff1a;“Python”集成技术高光谱遥感数据处理与机器学习教程 第一&#xff1a;高光谱基础 一&#xff1a;高光谱遥感基本概念 01)高光谱遥感 02)光的波长 03)光谱分辨率 04)高光谱遥感的历史和发展 二&#xff1a;高光谱传感器与数据获取 01)高…...

centos7 快速搭建自测mysql环境 docker + mysql

环境准备 centos7快速搭建docker mysql docker镜像源配置 一般都是要配的不然太慢了&#xff0c;docker 1.12以上创建或修改 /etc/docker/daemon.json 文件&#xff0c;修改为如下形式: 地址替换国内源 {"registry-mirrors" : ["https://docker.mirrors.u…...

c++视觉检测-----Canny边缘算子

Canny边缘算子 cv::Canny()是OpenCV库中用于执行Canny边缘检测的函数。Canny边缘检测是一种广泛使用的图像处理技术&#xff0c;用于检测图像中的边缘。 以下是cv::Canny()函数的一般用法和参数&#xff1a; void cv::Canny(cv::InputArray image, // 输入图像&#x…...

机器学习笔记 - 用于动作识别的网络TSN/TSM/SlowFast/R(2+1)D/3D MobileNetV2

一、简述 动作识别是在视频序列中检测和分类人类动作的过程。 近年来,由于其广泛的应用,它已成为一项越来越重要的技术,例如监控、人机交互以及视频索引和检索。 特别是,动作识别对于无人驾驶飞行器 (UAV) 或无人机来说变得至关重要,因为它们越来越多地用于各种应用,例如…...

mybatis批量插入

一、定义DBExec import java.util.List;public abstract class DBExec<T> {public abstract void operate(List<T> list); }二、定义BatchDBService public interface BatchDBService<T> {void exec(int batchSize, List<T> list, DBExec<T> d…...

软件‘小程序‘前台开发软件定制的知识|app网站搭建

软件&#xff0c;小程序&#xff0c;前台开发软件定制的知识 随着互联网的快速发展&#xff0c;软件&#xff0c;小程序&#xff0c;前台开发软件定制已经成为了企业必备的工具。它可以帮助企业更好地管理业务&#xff0c;提高效率&#xff0c;增强用户体验。那么&#xff0c;什…...

HTML-注册页面

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册页面</title> </head> <body><from action"#" method"get"><table border"1" align&q…...

17.(开发工具篇Gitlab)如何在Gitlab配置ssh key

前言: Git是分布式的代码管理工具,远程的代码管理是基于SSH的,所以要使用远程的Git则需要SSH的配置 一、git 配置 (1)打开 git 命令窗口 (2)配置用户名(填自己的姓名) git config --global user.name “chenbc” (3)配置用户邮箱(填自己的邮箱) git config …...

ArcGIS/GeoScene脚本:基于粒子群优化的支持向量机分类模型

参数输入 输出 栅格 预测为负类的概率 预测为正类的概率 二值化结果 评估结果 ROC曲线...

Python+Tkinter 图形化界面基础篇:添加图形和图像

PythonTkinter 图形化界面基础篇&#xff1a;添加图形和图像 引言添加图形元素步骤1&#xff1a;导入 Tkinter 步骤2&#xff1a;创建主窗口步骤3&#xff1a;创建 Canvas 步骤4&#xff1a;绘制图形 绘制线条 绘制矩形 绘制椭圆 绘制多边形 步骤5&#xff1a;启动主事件循环 显…...

前端js八股文大全

一、js的数据类型 值类型(基本类型)&#xff1a;数字(Number)、字符串&#xff08;String&#xff09;、布尔(Boolean)、对空&#xff08;Null&#xff09;、未定义&#xff08;Undefined&#xff09;、Symbol,大数值类型(BigInt) 引用数据类型&#xff1a;对象(Object)、数组…...

[环境]Ubuntu20.04安装Ceres

安装这么顺利我有点不适应&#xff0c;记录一下 注意安装的位置与层级关系 参考链接 知乎方案...

ruoyi 若依 前端vue npm install 运行vue前端

首次导入&#xff0c;需要先执行 npm install #进入到前端模块目录下 cd ruoyi-ui # 安装 npm install 启动后端项目 运行前端项目&#xff1a;运行成功后&#xff0c;会浏览器自动加载到前端首页&#xff08;或者 浏览器访问打印的两个地址&#xff09; # 运行 npm run dev 部…...

各大搜索引擎的User-Agent

各大搜索引擎的User-Agent baidu&#xff1a;Mozilla/5.0 (compatible; Baiduspider/2.0; http://www.baidu.com/search/spider.html) Google&#xff1a;Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html) Sogou&#xff1a;Sogou web spider/4.0(h…...

codesys【按钮】

1用于控制bool信号。 1声明全局变量 2绑定该变量 运行后&#xff0c;按钮就能控制这个bool变量了。 2按钮【自复位】 3按钮【锁位】...

SSH在桌面会话启动应用程序

通过远程SSH会话在实体机&#xff08;物理机&#xff09;的当前登录用户的桌面会话上启动应用程序 1. 找到用户的桌面会话的DISPLAY变量 在大多数情况下&#xff0c;主桌面会话的DISPLAY变量设置为:0&#xff0c;但为了确定&#xff0c;你可以运行以下命令查找活跃的DISPLAY&…...

React的类式组件和函数式组件之间有什么区别?

React 中的类组件和函数组件是两种不同的组件编写方式&#xff0c;它们之间有一些区别。 语法和写法&#xff1a;类组件是使用类的语法进行定义的&#xff0c;它继承自 React.Component 类&#xff0c;并且需要实现 render() 方法来返回组件的 JSX。函数组件是使用函数的语法进…...

codesys【读写轴参数】

在SM3_Basic库内。 作用&#xff1a;读写实轴寄存器参数。【一般用于修改2000h段的值】 或者获取6041h的状态值。 ecat主站操作&#xff1a; 补偿间隙&#xff1a; 追剪&#xff1a; 凸轮&#xff1a; 读写轴参数&#xff1a;...

Java架构师系统架构设计确定系统边界

目录 2 初始业务场景分析2.1 业务的需求分析重要性2.2 全面深入的理解业务从零到一从无到有2.3 需求分析3 系统和系统边界定义3.1 为什么要确定系统边界3 需求分析明确系统边界4 高层架构设计4.1 技术架构4.2 部署架构4.3 安全架构4.4 存储架构5 高层架构设计确定系统边界5.1 和…...

pytorch实现经典神经网络:VGG16模型之初探

文章链接 https://blog.csdn.net/weixin_44791964/article/details/102585038?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169675238616800211588158%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id16967523861680…...

Newtonsoft.Json use

private void button3_Click(object sender, EventArgs e) { List<Student> students new List<Student>(); students.Add(new Student { Id 1, Name "张三", Sex "男", Description "班长" }); students.…...

MySQL-3(9000字详解)

一&#xff1a;索引 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c;并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。 1.1索引的意义 索引的意义&#xff1a;加快查找速度&#xff0c;但需要…...

SLAM从入门到精通(3d 点云数据访问)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 3d 点云设备现在汽车上用的很多。之前3d lidar这种高端传感器&#xff0c;只能被少部分智能汽车使用。后来很多国产厂家也开始研发3d lidar之后&am…...

如何在 Spring Boot 中提高应用程序的安全性

如何在 Spring Boot 中提高应用程序的安全性 Spring Boot是一种流行的Java开发框架&#xff0c;用于构建Web应用程序和微服务。在构建应用程序时&#xff0c;安全性是至关重要的因素。不论您的应用程序是面向公众用户还是企业内部使用&#xff0c;都需要采取适当的措施来确保数…...

【Vuex+ElementUI】

一、导言 1、引言 Vuex是一个用于Vue.js应用程序的状态管理模式和库。它建立在Vue.js的响应式系统之上&#xff0c;提供了一种集中管理应用程序状态的方式。使用Vuex&#xff0c;您可以将应用程序的状态存储在一个单一的位置&#xff08;即“存储”&#xff09;中&#xff0c;…...

多媒体播放软件 Infuse mac中文特点介绍

Infuse mac是一款多媒体播放器应用&#xff0c;它支持播放多种格式的视频文件、音频文件和图片文件&#xff0c;并且可以通过AIrPlay将媒体内容投放到其他设备上。Infuse还支持在线视频流媒体播放和本地网络共享&#xff0c;用户可以通过它来访问家庭网络上的媒体文件。 Infuse…...

华为数通方向HCIP-DataCom H12-831题库(单选题:201-220)

第201题 如图所示,路由器所有的接口开启OSPF,链路的Cost值如图中标识。若在R2的OSPF进程中通过命令import-route direct type 1引入直连路由,则R1到达10.0.2.2 /32的Cost值是以下哪一选项? A、150 B、151 C、200 D、201 答案:C 解析: Loopback0的cost值默认为0,R1-R2的…...