简介
The fundamental package for scientific computing with Python
数组创建
import numpy as np
# 使用 numpy 生成数组,得到ndarray的类型
t1 = np.array([1, 2, 3, ])
t2 = np.array(range(10))
# 直接生成 ndarray
t3 = np.arange(4, 10, 2)
# 指定元素的类型创建数组
# https://numpy.org/doc/stable/reference/arrays.dtypes.html
t4 = np.array(range(1, 4), dtype="i1")
print(t4)
# ndarray 的元素类型
# 根据系统架构 如 x64 为 int64
print(t4.dtype)
# numpy中的bool类型
t5 = np.array([1, 1, 0, 1, 0, 0], dtype=bool)
# 取小数点后几位
t7 = np.array([random.random() for i in range(10)])
t8 = np.round(t7, 2)
数组形状
# 查看数组形状
arr.shape
# 修改数组形状
arr.reshape(3, 4)
arr.reshape(2, 3, 2)
arr.reshape((arr.size(), ))
广播
# 每个元素都 + * /标量
arr = arr + 3
arr = arr * 3
arr = arr / 3
# 相同维度矩阵对应元素运算
arr = arr1 + arr2
arr = arr1 * arr2
arr = arr1 / arr2
# 不同维度数组,广播原则
# 从末尾开始算起的维度相符或者其中一方为1,广播兼容。广播会在缺失或者长度为1的维度进行
# https://numpy.org/doc/stable/user/basics.broadcasting.html
arr3x4 = arr3x4 - arr3x1
# 不能计算
arr = arr3x3x3 - arr3x2
# 可以计算
arr = arr3x3x2 - arr3x3
arr = arr3x3x2 - arr3x2
例子,二维数组,每列分别减去列平均值
t7 = np.array([random.random() for i in range(20)])
t7 = t7.reshape((4, 5))
# 每一列求平均值后,按列分别计算差值
t7 = t7 - numpy.average(t7, 0)
轴
- 对于 1 维数组有 0 轴,对于 2 为住宿有 0,1 轴,以此类推
读取本地数据
# https://numpy.org/doc/stable/reference/generated/numpy.loadtxt.html
# unpack = 转置
t2 = np.loadtxt(file_path, delimiter=",", dtype="int", unpack=False)
转置
t = t.transpose()
t = t.T
# 交换轴
t = t.swapaxes(1, 0)
索引和切片
二维数组例子:
# 取某行
out = data[2]
# 取连续的多行到结尾
out = data[2:]
# 取指定的多行
out = data[[2, 8, 10]]
# 取指定列
out = data[:, 1]
# 取列到末尾
out = data[:, 2:]
# 取指定的列
out = data[:, [0, 2]]
# 取指定行指定列
out = data[2, 3]
# 取指定多行指定多列
out = data[2:5, 1:4]
# 取多个不相邻的点结果是一维数组
out = data[[0, 2], [0, 1]]
数值修改
布尔索引
# 获取所有指定条件值
out = data[data < 10]
# 修改所有小于 10 的数据,改为3
# 原地修改
data[data < 10] = 3
# 三元运算符
# 小于 3 则为 100 否则 300
np.where(n <= 3, 100, 300)
裁剪
# 对每个元素的值进行上下限裁剪
out = data.clip(10, 18)
赋值 nan
nan = not a number,
- 类型为 float
- 0 / 0 会出现
- 输入文件缺失或者 cast 异常
- inf 正无穷 -inf 负无穷
nan == nan为Falsenan任何操作结果都是nan- 注意点:
- 一般 nan 考虑影响,替换为 均值 or 中值(排序后中间的),不见已替换为 0
# 转换类型为 float
data = data.astype(float)
# 赋值
data[i, j] = numpy.nan
# 判断 nan 个数
numpy.count_nonzero(data != data)
numpy.count_nonzero(numpy.isnan(data))
统计函数
默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果
# 求和
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)
例子,替换 nan 为每列均值
# coding=utf-8
import numpy as np
# print(t1)
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
if __name__ == '__main__':
t1 = np.arange(24).reshape((4, 6)).astype("float")
t1[1, 2:] = np.nan
print(t1)
t1 = fill_ndarray(t1)
print(t1)
数据拼接
二维数组拼接:
# 竖直拼接
# 对应 numpy.vsplit()
numpy.vstack((t1, t2))
# 水平拼接
# 对应 numpy.hsplit()
numpy.hstack((t1, t2))
行列交换
# 交换1,2行
t[[1, 2], :] = t[[2, 1], :]
# 交换1,2列
t[:, [1, 2]] = t[, [2, 1]]
工具方法
# 获取按照某个轴,最大值最小值的位置,输出是一维数组
np.argmax(t, axis=0)
np.argmin(t, axis=1)
# 创建一个全0的数组
np.zeros((3, 4))
# 创建一个全1的数组
np.ones((3, 4))
# 创建一个对角线为1的正方形数组(方阵)
np.eye(3)
随机方法
# n 维随机数组
np.random.rand(d0, d1, ..dn)
# n 维正态分布随机数组
np.random.randn(d0, d1, ..dn)
# 按 shape 和上下限随机整型
np.random.randint(low, high, (shape))
# 均匀分布
np.random.randint(low, high, (size))
# 正态分布抽取样本
np.random.normal(low, high, (size))
# s 为种子随机
np.random.seed(s)
本文介绍NumPy的基础用法,包括数组创建、数组形状修改、索引与切片、广播等核心概念,并提供实用示例,如如何处理含有NaN的数据。

被折叠的 条评论
为什么被折叠?



