numpy
数组的形状
import numpy as nu
t1 = nu.arange(12)
print(t1)
print(t1.shape)
print(t1.reshape((2, 3, 2)))
# shape方法获得数组形状
# reshape方法改变数组形状,reshape(块数,行数,列数) 有返回值
# reshape((数值,)),将该数组转为一维数组
# flatten()方法快速将数组展开成为一维数组
·数组与数字进行运算时,数组内每个元素都会与其进行运算;
·数组与相同形状数组进行运算时,对应的位置进行运算;
·两个形状不同但行或列相同的数组进行运算时,相同维度进行运算并且向后延展;
·两个形状完全不同的数组不能进行运算。
例子:
t1 = nu.arange(24).reshape(4, 6)
print(t1)
print('================================')
t2 = t1 + 5
print(t2)
print('================================')
t3 = nu.arange(6)
print(t3)
print('===================================')
t4 = t3+t1
print(t4)
print('=================================')
t5 = nu.arange(4).reshape((4,1))
print(t5)
print('==================================')
t6 = t5 + t1
print(t6)
运行结果:
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
================================
[[ 5 6 7 8 9 10]
[11 12 13 14 15 16]
[17 18 19 20 21 22]
[23 24 25 26 27 28]]
================================
[0 1 2 3 4 5]
===================================
[[ 0 2 4 6 8 10]
[ 6 8 10 12 14 16]
[12 14 16 18 20 22]
[18 20 22 24 26 28]]
=================================
[[0]
[1]
[2]
[3]]
==================================
[[ 0 1 2 3 4 5]
[ 7 8 9 10 11 12]
[14 15 16 17 18 19]
[21 22 23 24 25 26]]
广播原则
如果两个数组的后缘维度,即从末尾开始算起的维度的轴长度相符1或其中一方的长度为一,则认为他们是广播兼容的,广播会在缺失和长度为一的维度上进行
数组的创建
a = nu.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) # 直接传列表
b = nu.array(range(10)) # 使用numpy生成数组
c = nu.arange(10)
print(c.dtype) # dtype方法获取数组存放的数据的类型
# astype方法修改数组的数据类型
d = [random.random() for i in range(10)] # random.random()获取小数
轴
在numpy中可理解为方向,对于一维数组,只有一个0轴,二维数组有0轴和1轴,对于三维数组有0,1,2轴,二维数组0轴表示行,1轴表示列,三维数组0轴表示块,1轴表示行,2轴表示列
numpy读取数据
CSV:Comma-Separated Value,逗号分隔值文件
显示:表格状态
源文件:换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录
delimiter:指定边界符号是什么,不指定会导致每行数据为一个整体的字符串而报错;
dtype:默认情况下对于较大的数据会将其变为科学计数的方式;
unpack:默认是Flase(0),默认情况下,有多少条数据就会有多少行,为True(1)的情况下,每一列的数据会组成一行,原始数据有多少列,加载出来的数据就会有多少行,转置效果。
转置
a = nu.arange(24).reshape((4, 6))
print(a)
print('*' * 20)
print(a.transpose()) # 转置方法transpose()
print('*' * 20)
print(a.T) # 转置方法T
print('*' * 20)
print(a.swapaxes(1, 0)) # 将轴进行转置
print('*' * 20)
print(a)
numpy的切片和索引
a = nu.array([random.random() * 100000 for i in range(100)]).reshape((25, 4))
b = a.astype(int)
# print(b)
print('*' * 20)
# 取行
print(b[2])
# 取连续多行
print(b[2:])
# 取不连续的多行
print(b[[1, 3, 5]])
print(b[1, :]) # 逗号前面是行,后面是列,表示取第一行,冒号表示列全都要
print(b[2:, :]) # 取连续的多行
print(b[[2, 4, 5], :]) # 取不连续的多行
# 取列
print(b[:, 3])
# 取连续多列
print(b[:, 2:])
# 取不连续的多列
print(b[:, [0, 3]])
# 取多行和多列,第2行第3列
print(b[2, 3])
# 取第三行到第五行,第一列到第三列的结果 包头不包尾,取得是行和列共同覆盖的值
print(b[2:5, 1:3])
# 取多个不相邻的点
d = b[[3, 1], [2, 2]] # 结果是(3,1)(2,2)
c = b[[0, 2, 2], [2, 3, 1]] # 结果是(0,2)(2,3)(2,1)一一对应
print(c)
numpy中数值的修改
b[2:3, :] = 0 # 对其进行赋值
# print(b)
b[b < 5000] = 1 # 将其中小于5000的全部变为1
print(b)
print(b[b > 10000]) # 输出其中大于10000的数
三元运算符
numpy.where(b<x,y,z)三元运算符,b中的数如果小于x则替换成y,如果大于x则换成z
d = b.clip(a,b)(裁剪方法)将b中小于a的替换成a,大于b的替换成b
c = nu.where(b < 5000, 1, 2) # 将b中小于5000的替换成1,大于5000的替换成2
d = b.clip(5000,10000) # 将小于5000的替换成5000,大于10000的替换成10000
b[3,3] = nu.nan # 将b[3,3]转为nan
数据的拼接
# 竖直拼接
c = nu.vstack((a, b)) # 每一列代表的意义相同
# 水平拼接
d = nu.hstack((a, b))
数组的行列交换
# 行交换
# a[[1, 2], :] = a[[2, 1], :]
# # 列交换
# a[:, [3, 2]] = a[:, [2, 3]]
获取最大值最小值
```python
获取最大值的位置
nu.argmax(a, axis=0)
获取最小值的位置
nu.argmin(a, axis=0)
创建全为0或全为1的数组
# zeros()方法创建全为0的数组
# ones()方法创建全为1的数组
c = nu.zeros((a.shape[0], 1)) # 创建1列为0的数组
d = nu.ones((b.shape[0], 1)) # 创建1列为1的数组
创建一个对角线为1的正方形数组(方阵)
nu.eye(x) #创建一个x行x列的方阵
注意:
1.a=b完全不复制,a和b相互影响
2.a=b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的,
3.a=b,copy(),复制,a和b互不影响
numy中的nan和inf
nan(NAN,Nan):表示的不是一个数字
出现nan的原因:
1.当我们读取本地的文件为float的时候,如果有缺失就会出现nan
2.当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)
注意:
1。两个nan是不相等的
2.nu.nan!=nu.nan
3.利用以上特性,判断数组中nan的个数
nu.count_nonzero(x!=x)
4.nan和任何值计算都为nan
5.通过nu.isnan(x)来判断一个数字是否为nan,返回bool类型
sum()方法
nu.sum(x,axis=0)计算x数组每一列相加的结果
nu.sum(x,axis=1)计算x数组每一行相加的结果
nu.sum(x)计算x数组所有值相加的结果