numpy

自学整理记录,大神见笑

为什么学习numpy

  • 快速
  • 方便
  • 科学计算的基础库

什么是numpy

  • 一个在Python中做科学计算的基础库,重在数值计算,也是大部分Python科学计算库的基础库,多用于在大型、多维数组上执行数值运算
  • 导包

import numpy as np

numpy基础操作

  • 创建数组,生成ndarray

t1 = numpy.arange(3)
t2 = numpy.arange(3, 7)
t3 = numpy.arange(3, 7, 2)
t4 = numpy.arange(0, 1, 0.1)
t5 = numpy.arange(3.0)
print(t1)
print(t2)
print(t3)
print(t4)
print(t5)
输出:array([0, 1, 2])
array([3, 4, 5, 6])
array([3, 5])
array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
array([ 0., 1., 2.])

  • 注:array([0, 1, 2])这种格式就是ndarray

  • 注:np.arange(10)是numpy特有方法,等于np.array(range(10))

  • 查看ndarray中的元素数据类型

t1 = numpy.arange(3)
t1.dtype

  • numpy有特有数据类型
numpy数据类型.jpg
  • 指定ndarray中的元素数据类型

np.arange(4,dtype="float32")

  • 调整ndarray中元素的数据类型

t1 = np.arange(4,dtype="float32")
t2 = t1.astype("bool")

  • 限制小数位数

t1 = np.array([random.random() for i in range(10)])
np.round(t1, 2)

  • 注:round第二个参数就表示保留几位小数

数组的形状

  • 查看数组的形状

a = numpy.array([1, 2, 3])
b = numpy.array([[1, 2, 3],[4, 5, 6]])
print(a.shape)
print(b.shape)
输出:(3,)
(2,3)

  • 修改数组的形状

t1 = numpy.arange(12)
print(t1.reshape((3, 4)))
输出:([[0,1,2,3], [4,5,6,7], [8,9,10,11]])

  • 注:reshape有返回值,不会改变原来t1的形状

  • 注:变成一维数组传(24,),24为所有元素的个数

  • 将其他形状数组展开成一维数组

t1 = numpy.arange(12).reshape((3, 4)
t1.flatten()

  • 将数组转置

t1 = np.arange(12).reshape(3,4)
t1.transpose()
t1.T
t1.swapaxes(1,0)

  • 注:转置就是将数组按对角线为中心交换数据

  • 注:转置有上面三种方法

  • 计算

t1 = numpy.arange(12).reshape((3, 4)
print(t1 + 2)
print(t1 - 2)
print(t1 * 2)
print(t1 / 2)

  • 注:t1中每个值都会去计算加减乘除
  • 注:t1 / 0,如果t1元素的值是0,则返回nan;如果不是0,则返回inf

t1 = numpy.arange(12).reshape((3, 4)
t2 = numpy.arange(100,112).reshape((3, 4)
print(t1 + t2)
print(t1 - t2)
print(t1 * t2)
print(t1 / t2)

  • 注:对应位置的元素做计算
  • 注:维度不同的数组进行计算,符合广播原则就可以计算;没有对应就会报错ValueError: operands could not be broadcast together with shapes
  • 注:广播原则:如果两个数组的后缘维度的轴长度相等或其中一方的长度为1,即认为广播兼容,可以计算

  • 在numpy中使用0,1,2...数字表示,一维数组只有一个0轴;二维数组(shape(0,0))有0轴和1轴;三维数组(shape(0,0,0))有0轴和1轴和2轴
二维数组轴.jpg
三维数组轴.jpg

numpy读取数据

  • numpy实际中不会用读取数据库数据功能,因为pandas中有更强大的方法是,了解即可

  • csv文件,逗号分隔文件,csv文件里所有的数据都是用逗号隔开的

  • 读取

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

参数 解释
frame 路径
dtype 元素数据类型,默认会把较大的数据转化为科学计数的方式
delimiter 以什么分隔,不指定会报错
skiprows 跳过前x行,一般跳过第一行表头
usecols 读取指定的列,索引,元组类型
unpack 默认False,如果是True则转置

numpy索引和切片

  • 取单行

t1[2]

  • 取连续多行

t1[2:]

  • 取不连续多行

t1[[2,8,10]]

  • 取单列

t1[:,0]

  • 取连续多列

t1[:,2:]

  • 取不连续多列

t1[:,[2,6,8]]

  • 同时取单行和单列

t1[2,3]

  • 同时取多行和多列

t1[2:5,1:4]

  • 注:冒号:左闭右开

  • 取多个不相邻的点

t1[[0,2,3],[0,1,3]]

  • 注:取的是坐标(0,0)(2,1)(3,3)三个点

  • 修改numpy中的数值

t1[:,2:4] = 0

  • 注:取到对应的行、列、点赋值即可

  • 修改筛选出来的条件的值

t1[t1 < 10] = 10

  • 注:上面表示所有小于10的点修改为10

  • numpy中三元运算符

np.where(t < 10, 0, 10)

  • 注:表示所有小于10的数替换为0,大于等于10的数替换为10

  • numpy中的clip(裁剪)

t.clip(10, 18)

  • 注:表示把小于10的都替换为10,大于18的都替换为18

  • 把值替换为nan

t1.astype(float)
t2[3,3] = np.nan

  • 注:如果直接执行第二句代码,可能会报错ValueError:cannot convert float NaN to integer,表示不能将int类型的nan赋值给float,nan是float类型

数组的拼接

  • 竖直拼接

t1 = array([[0,1,2],[3,4,5]])
t2 = array([[6,7,8],[9,10,11]])
np.vstack((t1, t2))
结果是array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])

  • 水平拼接

t1 = array([[0,1,2],[3,4,5]])
t2 = array([[6,7,8],[9,10,11]])
np.hstack((t1, t2))
结果是array([[0,1,2,6,7,8],[3,4,5,9,10,11]])

数组的行列交换

  • 行交换

t1[[1,2],:] = t1[[2,1],:]

  • 列交换

t1[:,[1,2]] = t1[:,[2,1]]

numpy更多方法

  • 创建一个全0的数组

np.zeros((3, 4))

  • 创建一个全1的数组

np.ones((3, 4))

  • 创建一个对角线为1的数组

np.eye(10)

  • 注:10参数为10行10列

  • 获取最大值,最小值的位置

np.argmax(t, axis=0)
np.argmin(t, axis=0)

  • 注:axis=0,表示列;axis=1,表示行

numpy生成随机数

参数 解释
np.random.rand(d0,d1,...dn) 创建d0到dn维度均匀分布的随机数数组
np.random.randn(d0,d1,...dn) 创建d0到dn维度正态分布的随机数数组
np.random.randint(low,high,(shape)) 生成随机整数,low到high是范围,size是形状
np.random.uniform(low,high,(size)) 生成随机小数,low到high是范围,size是形状
np.random.seed(s) 只在第一次生成随机数,后续再生成和第一次一样

numpy的注意点copy和view

  • a = b,a = b[:],复制,会相互影响
  • a = b.copy(),复制,a和b互不影响

numpy中的nan和inf

  • nan:not a number表示不是一个数字,nan是浮点类型

  • nan出现情况
    1.0除0
    2.数据缺失
    3.无穷大减去无穷大,无穷大加上无穷大

  • inf:infinity,inf表示正无穷,-inf表示负无穷,inf是浮点类型

  • inf出现情况
    1.一个非0数字除0

  • 注意点:
    1.np.nan == np.nan False
    2.np.nan != np.nan True
    3.np.count_nonzero(t != t) 判断ndarray中nan个数
    4.np.isnan(t) 判断ndarray中哪些地方是nan,可以替换为0
    5.nan和任何值计算都是nan
    6.把nan替换为0不合适,会降低平均值等,合适的操作时替换为均值

  • nan替换为均值示例代码

import numpy as np

t1 =np.arange(12).reshape((3,4)).astype("float")
t1[1, 2:4] = np.nan
print(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:
  # 获取该列所有值不是nan的array
  temp_not_nan_col = temp_col[temp_col == temp_col]
  # 将temp_not_nan_col的均值赋值给temp_col中值为nan的位置
  temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean()


print(t1)

numpy中常用统计函数

函数 含义
np.sum(t,axis=None) 求和
np.mean(t,axis=None) 均值
np.median(t,axis=None) 中值
np.max(t,axis=None) 最大值
np.min(t,axis=None) 最小值
np.ptp(t,axis=None) 最大值和最小值的差
np.std(t,axis=None) 标准差

你可能感兴趣的:(numpy)