numpy模块

1 创建数组

t1 = np.array([1,2,3])
print(t1)
t2 = np.arange(0,5,2)#用法和range相同
print(t2)
type(t2) #numpy.ndarray
print(t2.dtype) #int32
#创建指定数据类型的数组
np.array([0,1,0,1,1,0],dtype=np.bool)
a = np.array([1,2,3],dtype=np.int32)
print(a.dtype) #int32
#修改数组的数据类型
a.astype(np.int8) #创建了一个新数组,原数组不变
#修改小数位数
b = np.array([random.random() for i in range(5)])
np.round(b,2)

2 数组的运算

数组的运算为广播运算:
shape为(3,3,3)的数组能够和(3,2)的数组进行计算么?不能
shape为(3,3,2)的数组能够和(3,2)的数组进行计算么?可以
shape为(3,3,2)的数组能够和(3,3)的数组进行计算么?可以

3 轴(axis)

np.arange(0,10).reshape((2,5))
reshape中2表示0轴长度(包含数据的条数)为2,1轴长度为5,2X5一共10个数据
二维数组的轴:
在这里插入图片描述
三维数组的轴:
在这里插入图片描述

4 读取CSV文件

np.loadtxt(fname,dtype=np.float,delimiter=None)
fname:文件路径
dtype:数据格式
delimiter:数据的分隔符

5 转置

t = np.arange(10).reshape(2,5)
t.T

6 索引和切片

取行:
t2[2] 取第三行
t2[2,:]

取连续的多行:
t[2:] 
t[2:,:]

取不连续的多行:
t2[[2,8,10]] 取第一,七,九行
t2[[2,10,3],:]
--------------------------
取第一列:
t2[:,0]

取连续的多列:
t[:,2:]

取不连续的多列
t2[:,[0,2]]
--------------------------
取行和列,取第3行,第四列的值
t2[2,3]

取多行和多列,取第3行到第五行,第2列到第4列的结果
t2[2:5,1:4]

取的是行和列交叉点的位置
t2[2:5,1:4]21)和(54)

取多个不相邻的点
选出来的结果是(00) (21) (23)
t2[[0,2,2],[0,1,3]]

7 数值修改

t中小于10的数字替换为3:
t[t<10]=0

三元运算符
把t中小于10的数字替换为0,把大于20的替换为20
np.where(t<10,1,20) #创建了新的数组,原数组不变

clip
小于10的替换为10,大于18的替换为了18
t.clip(10,18) #创建了新的数组,原数组不变

8 Nan和Inf

nan(NAN,Nan):not a number表示不是一个数字
inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷;一个数字除以0,(python中直接会报错,numpy中是一个inf或者-inf)

a = np.inf
type(a) # float
a = np.nan
type(a) # float

8.1 nan注意点

1、两个nan不相等

np.nan == np.nan #Falese

2、np.nan != np.nan

np.nan != np.nan #True

3、利用以上特性,可判断数组中nan的个数

t = np.arange(1,4).astype(np.float)
t[2] = np.nan
np.count_nonzero(t!=t)

4、通过np.isnan(a)来判断一个数字是否为nan,返回bool类型

np.isnan(t) #array([False, False, True])
-------------
把nan替换成0:
t[np.isnan(t)] = 0

5、nan和任何值计算都为nan

8.2 nan的处理

单纯的把nan替换为0,不合适,比如,全部替换为0后,替换之前的平均值如果大于0,替换之后的均值肯定会变小,所以更一般的方式是把缺失的数值替换为均值(中值)或者是直接删除有缺失值的一行。
如t中存在nan值,如何操作把其中的nan填充为每一列的均值?
t = array([[ 0., 1., 2., 3., 4., 5.],
[ 6., 7., nan, 9., 10., 11.],
[ 12., 13., 14., nan, 16., 17.],
[ 18., 19., 20., 21., 22., 23.]])

def fill_ndarray(t1):
    for i in range(t1.shape[1]):  #遍历每一列
        temp_col = t1[:,i]  #当前的一列
        nan_num = np.count_nonzero(temp_col!=temp_col)
        if nan_num !=0: #不为0,说明当前这一列中有nan
            temp_not_nan_col = temp_col[temp_col==temp_col] #当前一列不为nan的array

            # 选中当前为nan的位置,把值赋值为不为nan的均值
            temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean()
    return t1

9 常用统计函数

求和:t.sum(axis=None)
均值:t.mean(a,axis=None)  受离群点的影响较大
中值:np.median(t,axis=None) 
最大值:t.max(axis=None) 
最小值:t.min(axis=None)
极值:np.ptp(t,axis=None) 即最大值和最小值只差
标准差:t.std(axis=None) 

默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果

10 数组的拼接

在这里插入图片描述

np.vstack((t1,t2)) 竖直拼接

在这里插入图片描述

np.hstack((t1,t2)) 水平拼接

在这里插入图片描述
数组水平或者竖直拼接很简单,但是拼接之前应该注意什么?
竖直拼接的时候:每一列代表的意义相同!!!否则牛头不对马嘴
如果每一列的意义不同,这个时候应该交换某一组的数的列,让其和另外一类相同

11 行列交换

行交换
t[[1,2],:] = t[[2,1],:] 
-------------------------
列交换
t[:[1,2]] = t[:[2,1]] 

12 快速创建数组

获取最大值最小值的位置
  np.argmax(t,axis=0)
  np.argmin(t,axis=1)
创建一个全0的数组: np.zeros((3,4))
创建一个全1的数组:np.ones((3,4))
创建一个对角线为1的正方形数组(方阵):np.eye(3)

13 numpy生成随机数

在这里插入图片描述

14 copy和view的注意点

1、a=b 完全不复制,a和b相互影响

a = np.arange(10).reshape(5,2)
print(id(a)) ->2632565615712
b = a
print(id(b)) ->2632565615712

2、a = b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的

c = a[:,0]
id(c) ->2632565615952
c[0] = 20
a和c都发生变化

3、a = b.copy(),复制,a和b互不影响

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值