Numpy学习笔记

笔记参考:Numpy | 走在小路上 (hwl.cool)

Numpy (Numerical Python) 是一个开源的Python科学计算库,用于快速处理任意维度的数组。

Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。

Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。

ndarray

NumPy提供了一个N维数组类型ndarray,它描述了相同类型的"items"的集合

优势

  1. 存储风格
    • ndarray - 相同类型 - 通用性不强
    • list - 不同类型 - 通用性很强
  2. 并行化运算
    • ndarray支持向量化运算
  3. 底层语言
    • Numpy底层使用C语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制,效率远高于纯Python代码。

属性

属性名字属性解释
ndarray.shape数组维度的元组
ndarray.ndim数组维数
ndarray.size数组中的元素数量
ndarray.itemsize一个数组元素的长度(字节)
ndarray.dtype数组元素的类型

在创建ndarray的时候,如果没有指定类型,

默认:整数 int64/int32

浮点数:float64/float32

使用

import numpy as np
score = np.array([[80, 89, 86, 67, 79],
[78, 97, 89, 67, 81],
[90, 94, 78, 67, 74],
[91, 91, 90, 67, 69],
[76, 87, 75, 67, 86],
[70, 79, 84, 67, 84],
[94, 92, 93, 67, 64],
[86, 85, 83, 67, 80]])
print(type(score))
print(score.shape)
print(score.dtype)

# 创建数组的时候指定类型
np.array([1.1, 2.2, 3.3], dtype="float32")


基本操作

生成数组

1、生成0和1的数组

np.zeros(shape=(3, 4), dtype="float32") # 生成一组0
np.ones(shape=[2, 3], dtype=np.int32) # 生成一组1

2、从现有数组生成

data1 = np.array(score) # 深拷贝
data2 = np.asarray(score) # 浅拷贝
data3 = np.copy(score) # 深拷贝

 3、生成固定范围的数组

np.linspace(0, 10, 5) # 生成[0,10]之间等距离的5个数
np.arange(0, 11, 5) # [0,11),5为步长生成数组

4、生成随机数组

均匀分布

# 生成均匀分布的一组数[low,high)
data1 = np.random.uniform(low=-1, high=1, size=1000000)

正态分布

# 生成正态分布的一组数,loc:均值;scale:标准差
data2 = np.random.normal(loc=1.75, scale=0.1, size=1000000)



数组的索引、切片

stock_change = np.random.normal(loc=0, scale=1, size=(8, 10))
# 获取第一个股票的前3个交易日的涨跌幅数据
print(stock_change[0, :3])

# 修改值
a1 = np.array([ [[1,2,3],[4,5,6]], [[12,3,34],[5,6,7]]])
a1[1, 0, 2] = 100000
a1

形状修改

stock_change.reshape((10, 8)) # 返回新的ndarray,原始数据没有改变
stock_change.resize((10, 8)) # 没有返回值,对原始的ndarray进行了修改
stock_change.T # 转置 行变成列,列变成行

 

类型修改

stock_change.astype("int32")
stock_change.tostring() # ndarray序列化到本地

数组去重

temp = np.array([[1, 2, 3, 4],[3, 4, 5, 6]])
np.unique(temp)
set(temp.flatten())

flatten() 安装行序 降维


ndarray运算

逻辑运算

运算符

# 逻辑判断, 如果涨跌幅大于0.5就标记为True 否则为False
stock_change > 0.5
stock_change[stock_change > 0.5] = 1.1

通用判断函数

# 判断stock_change[0:2, 0:5]是否全是上涨的
#ap.all()
np.all(stock_change[0:2, 0:5] > 0)
# 判断前5只股票这段期间是否有上涨的
#np.any()
np.any(stock_change[:5, :] > 0)

三元运算符

# np.where(condition, x, y)
# 满足条件(condition),输出x,不满足输出y。

#np.where(condition)
#只有条件 (condition),没有x和y,则输出满足条件 (即非0) 元素的坐标 (等价于numpy.nonzero)。这里的坐标以tuple的形式给出,通常原数组有多少维,输出的tuple中就包含几个数组,分别对应符合条件元素的各维坐标。
# 判断前四个股票前四天的涨跌幅 大于0的置为1,否则为0
temp = stock_change[:4, :4]

# np.where(布尔值,True的位置的值,False的位置的值)
np.where(temp > 0, 1, 0)
# 大于0.5且小于1
np.where(np.logical_and(temp > 0.5, temp < 1), 1, 0)
# 大于0.5或小于-0.5
np.where(np.logical_or(temp > 0.5, temp < -0.5), 11, 3)


统计运算

统计指标函数

min,max,mean(均值),median(中位数),var(方差),std(标准差).

amax(a, axis=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)
* Return the maximum of an array or maximum along an axis.寻找矩阵最大和最小的元素
* axis=0 代表行 , axis=1 代表列
* 若要返回每一列元素的最大值,需要在 axis=1 方向进行比较,则指定 axis=1
* 若要返回每一行的最大值,在 axis=0 方向进行比较,则指定 axis=0
# 返回每一行最大元素
temp.max(axis=0)
# 返回每一列最大元素
np.max(temp, axis=1)

返回最大值、最小值的位置

np.argmax(tem,axis=)

np.argmin(tem,axis=)

# 倒序寻找每一列最大元素位置
np.argmax(temp, axis=-1)


数组间运算

数组与数的运算

arr = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
arr / 10

数组与数组的运算

广播机制

执行broadcast的前提在于,两个nadarray执行的是element-wise的运算,Broadcast机制的功能是为了方便不同形状的ndarray(numpy库的核心数据结构)进行数学运算。

当操作两个数组时,numpy会逐个比较它们的shape(构成的元组tuple),只有在下述情况下,两个数组才能够进行数组与数组的运算。

  • 维度相等
  • shape(其中相对应的一个地方为1)

矩阵运算

matrix,和array的区别是矩阵必须是2维的,但是array可以是多维的。

np.mat() 将数组转换成矩阵类型

矩阵乘法规则(M行,N列)x (N行,L列) = (M行,L列)

如果是ndarray

np.dot(a, b)
np.matmul(a, b)
a @ b

如果是martix

a * b


合并

numpy.hstack 水平拼接

arr1 = np.array([[1,3], [2,4] ])
arr2 = np.array([[1,4], [2,6] ])
res = np.hstack((arr1, arr2))
print (res)

numpy.vstack 竖拼接

res = np.vstack((arr1,arr2))

numpy.concatenate((a1,a2),axis=0) 水平|竖拼接

axis = 0 竖拼接

axis = 1 水平拼接

分割

numpy.split(ary, indices_or_sections, axis=0)
ary:要切分的数组 
indices_or_sections:如果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭) 
axis:沿着哪个维度进行切向,默认为0,横向切分。为1时,纵向切分

# 分割
numpy.split(x,3) # 分三份
numpy.split(x,[3,4,6,10]) # 按索引分割


IO操作与数据处理

读取数据

np.genfromtxt("test.csv", delimiter=",") # 会有问题,读不出字符串

如何处理缺失值

两种思路:

  • 直接删除含有缺失值的样本
  • 替换/插补 (补入平均值或中位数)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值