python3 numpy模块

python3 numpy模块

什么是numpy?

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

创建数组(矩阵)

import numpy as np

# 创建数组方式一
t1 = np.array([1, 2, 3])

# [1 2 3]
print(t1)

# 创建数组方式二
t2 = np.array(range(10))

# 数据类型为:numpy.ndarray
print(type(t2))

# 创建数组方式三
t3 = np.arange(4, 10, 2)

# 存放的是数据类型为:int32
print(t3.dtype)

常见的数据类型

类型 代码类型 说明
int8、unit8 i1、u1 有符号和无符号的8位(1个字节)整型
int16、unit16 i2、u2 有符号和无符号的16位(2个字节)整型
int32、unit32 i4、u4 有符号和无符号的32位(4个字节)整型
int64、unit64 i8、u8 有符号和无符号的64位(8个字节)整型
float16 f2 半精度浮点数
float32 f4或f 标准的单精度浮点数,与C的float兼容
float64 f8或d 标准的双精度浮点数,与C的double和Python的float对象兼容
float128 f16或g 扩展精度浮点数
complex64、complex128、complex256 c8、c16、c32 复数
bool ? 存储True和False的布尔类型

数据类型操作

import numpy as np

# 指定创建数组的数据类型
t1 = np.array(range(1, 4), dtype='float64')

# float64
print(t1.dtype)

# 修改数组的数据类型,方式一
t2 = t1.astype(np.int8)

# int8
print(t2.dtype)

# 修改数组的数据类型,方式二
t3 = t1.astype('i2')

# int16
print(t3.dtype)


t4 = np.array([0.0485436, 0.26320629, 0.69646413])

# 修改浮点型的小数的位数
t5 = np.round(t4, 2)

# [0.05 0.26 0.7 ]
print(t5)

数组的形状

import numpy as np

t1 = np.arange(12)
# 通过shape属性查看数组形状
# (12,)
print(t1.shape)

t2 = np.array([[1, 2, 3], [4, 5, 6]])
# (2,3)
print(t2.shape)

t3 = np.array([[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]])
# (2,2,3)
print(t3.shape)

# 通过reshape方法修改数组形状
t5 = t1.reshape(3, 4)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]
print(t5)

# 通过flatten方法将多维数组转换为一维数组
t6 = t5.flatten()
# [ 0  1  2  3  4  5  6  7  8  9 10 11]
print(t6)

数组和数的计算

'''
在运算过程中,加减乘除的值都被广播到所有的元素上面
'''

import numpy as np

a = np.array([[3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9]])
b = 2

# 数组与数的加减法
c = a+b
# [[ 5  6  7  8  9 10]
#  [ 6  7  8  9 10 11]]
print(c)

# 数组与数的乘除法
c = a*b
# [[ 6  8 10 12 14 16]
#  [ 8 10 12 14 16 18]]
print(c)

数组与数组的计算1

import numpy as np

a = np.array([[3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9]])
b = np.array([[21, 22, 23, 24, 25, 26], [27, 28, 29, 30, 31, 32]])

# 数组与数组的加减法
c = a+b
# [[24 26 28 30 32 34]
#  [31 33 35 37 39 41]]
print(c)

# 数组与数组的乘除法
c = a*b
# [[ 63  88 115 144 175 208]
#  [108 140 174 210 248 288]]
print(c)

数组与数组的计算2

import numpy as np

a = np.array([[3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9]])
b = np.array([1, 2, 3, 4, 5, 6])

# 数组与数组的加减法
# [[ 4  6  8 10 12 14]
#  [ 5  7  9 11 13 15]]
c = a+b
print(c)


# 数组与数组的乘除法
c = a*b
# [[ 3  8 15 24 35 48]
#  [ 4 10 18 28 40 54]]
print(c)

数组与数组的计算3

import numpy as np

a = np.array([[3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9]])
b = [[1], [2]]


# 数组与数组的加减法
c = a+b
# [[ 4  5  6  7  8  9]
#  [ 6  7  8  9 10 11]]
print(c)

# 数组与数组的乘除法
c = a*b
# [[ 3  4  5  6  7  8]
#  [ 8 10 12 14 16 18]]
print(c)

在numpy中可以理解为方向,使用0,1,2...数字表示,对于一个一维数组,只有一个0轴,对于2维数组(shape(2,2)),有0轴和1轴,对于三维数组(shape(2,2, 3)),有0,1,2轴

有了轴的概念之后,我们计算会更加方便,比如计算一个2维数组的平均值,必须指定是计算哪个方向上面的数字的平均值

读取数据

import numpy as np

us_file_path = './youtube_video_data/US_video_data_numbers.csv'
uk_file_path = './youtube_video_data/GB_video_data_numbers.csv'

t1 = np.loadtxt(us_file_path, delimiter=',', dtype='int')
t2 = np.loadtxt(uk_file_path, delimiter=',', dtype='int')
参数 说明
frame 文件、字符串或产生器,可以是.gz或bz2压缩文件
dtype 数据类型,可选,CSV的字符串以什么类型读入数组,默认np.float
delimiter 分隔字符串,默认是任何空格,改为逗号
skiprows 跳过前x行,一般跳过第一行表头
usecols 读取指定的列,索引,元组类型
unpack 如果为True,读入属性将分别写入不同数组变量,False读入数据只写入一个数组变量,默认为False

转置

转置是一种变换,对于numpy中的数组来说,就是在对角线方向交换数据,目的也是为了更方便的去处理数据

import numpy as np

t = np.array([[0, 1, 2, 3, 4, 5],
              [6, 7, 8, 9, 10, 11],
              [12, 13, 14, 15, 16, 17]])

# 方式一
t1 = t.transpose()
# [[ 0  6 12]
#  [ 1  7 13]
#  [ 2  8 14]
#  [ 3  9 15]
#  [ 4 10 16]
#  [ 5 11 17]]
print(t1)

# 方式二
# 交换轴
t1 = t.swapaxes(1, 0)

# 方式三
t1 = t.T

索引和切片

import numpy as np

t = np.array([[1, 2, 3, 4],
              [5, 6, 7, 8],
              [9, 10, 11, 12],
              [13, 14, 15, 16]])

# 取一行
t1 = t[1]
# [5 6 7 8]
print(t1)

# 取连续的多行
t2 = t[1:3]
# [[ 5  6  7  8]
#  [ 9 10 11 12]]
print(t2)

# 取不连续多行
t3 = t[[0, 1, 3]]
# [[ 1  2  3  4]
#  [ 5  6  7  8]
#  [13 14 15 16]]
print(t3)

# 取一列
t4 = t[:, 0]
# [ 1  5  9 13]
print(t4)

# 取连续的多列
t5 = t[:, 1:3]
# [[ 2  3]
#  [ 6  7]
#  [10 11]
#  [14 15]]
print(t5)

# 取不连续的多列
t6 = t[:, [0, 2, 3]]
# [[ 1  3  4]
#  [ 5  7  8]
#  [ 9 11 12]
#  [13 15 16]]
print(t6)

# 取偶数行
t7 = t[1::2]
# [[ 5  6  7  8]
#  [13 14 15 16]]
print(t7)

# 取奇数列
t8 = t[:, ::2]
# [[ 1  3]
#  [ 5  7]
#  [ 9 11]
#  [13 15]]
print(t8)

# 取多个不相邻的点
# 选取(1,0),(3,2)两个点
t9 = t[[1, 3], [0, 2]]
# [ 5 15]
print(t9)

数值的修改1

import numpy as np

t = np.array([[1, 2, 3, 4],
              [5, 6, 7, 8],
              [9, 10, 11, 12],
              [13, 14, 15, 16]])

# 将第二行和第三行替换为0
t[:, 1:3] = 0
# [[ 1  0  0  4]
#  [ 5  0  0  8]
#  [ 9  0  0 12]
#  [13  0  0 16]]
print(t)

数值修改2

import numpy as np

t = np.array([[1, 2, 3, 4],
              [5, 6, 7, 8],
              [9, 10, 11, 12],
              [13, 14, 15, 16]])

# 将t中小于10的数字替换成0
t[t < 10] = False
# [[0  0  0  0]
#  [0  0  0  0]
#  [0 10 11 12]
#  [13 14 15 16]]
print(t)

数值修改3

import numpy as np

t = np.array([[1, 2, 3, 4],
              [5, 6, 7, 8],
              [9, 10, 11, 12],
              [13, 14, 15, 16]])

# 将t中小于10的数替换成0,其余的替换成1
t1 = np.where(t < 10, 0, 1)
# [[0 0 0 0]
#  [0 0 0 0]
#  [0 1 1 1]
#  [1 1 1 1]]
print(t1)

clip(裁剪)

import numpy as np

t = np.array([[1, 2, 3, 4],
              [5, 6, 7, 8],
              [9, 10, 11, 12],
              [13, 14, 15, 16]])

# 将t中小于5的数替换成5,将t中大于10的数替换成10
t1 = t.clip(5, 10)
print(t1)

nan和inf

nan(NAN,Nan):not a number表示不是一个数字

inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷

nan和inf属于float类型

两个nan不相等

通过方法isnan来判断是否为nan

nan和任何数字计算都是nan

import numpy as np

t = np.array([[1, 2, 3, 4],
              [5, 6, 7, 8],
              [9, 10, 11, 12],
              [13, 14, 15, 16]])

# 先把t转换成float类型
t = t.astype(float)
# 将(4,4)点的值替换成nan
t[3, 3] = np.nan
# [[ 1.  2.  3.  4.]
#  [ 5.  6.  7.  8.]
#  [ 9. 10. 11. 12.]
#  [13. 14. 15. nan]]
print(t)

常用的统计方法

作用 公式
求和 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)
import numpy as np

t = np.array([[0, 2, 3, 4],
              [0, 6, 7, 8],
              [0, 10, 11, np.nan],
              [0, 14, 15, np.nan]])

# 统计t中不为0的个数
num = np.count_nonzero(t)
print(num)

# 统计t中nan的个数
# np.nan != np.nan
num = np.count_nonzero(t != t)
print(num)


# 统计t中nan的个数
num = np.count_nonzero(np.isnan(t))
print(num)

# 将t中的nan替换为0
t[np.isnan(t)] = 0
print(t)


t = np.array([[0, 1, 2, 3],
              [4, 5,  6, 7],
              [8, 9, 10, 11]])

# 计算t中所有数字的和
t_sum = np.sum(t)
# 66
print(t_sum)

# 计算0轴上所有数字的和
# axis参数指定计算那个轴上的数字
t_sum = np.sum(t, axis=0)
# [12 15 18 21]
print(t_sum)

缺失值填充均值

import numpy as np


def fill_ndarray(t1):
    # 遍历每一列
    for i in range(t1.shape[1]):
        # 每一列的数据
        temp_col = t1[:, i]
        # nan的数量
        nan_num = np.count_nonzero(temp_col != temp_col)
        if nan_num != 0:
            # 取一列中非nan的数据
            temp_not_nan_col = temp_col[temp_col == temp_col]
            # 将原数据为nan的位置替换为该列的平均值
            temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean()
    return t1


if __name__ == "__main__":

    t1 = np.arange(12).reshape(3, 4).astype('float')
    t1[1, 2:] = np.nan

    t2 = fill_ndarray(t1)
    print(t2)

数据的拼接

import numpy as np

t1 = np.array([[1, 2, 3, 4, 5],
               [6, 7, 8, 9, 10]])

t2 = np.array([[11, 12, 13, 14, 15],
               [16, 17, 18, 19, 20]])

# 水平拼接
t3 = np.hstack((t1, t2))
# [[ 1  2  3  4  5 11 12 13 14 15]
#  [ 6  7  8  9 10 16 17 18 19 20]]
print(t3)

# 竖直拼接
t4 = np.vstack((t1, t2))
# [[ 1  2  3  4  5]
#  [ 6  7  8  9 10]
#  [11 12 13 14 15]
#  [16 17 18 19 20]]
print(t4)

数组的行列交换

import numpy as np

t = np.arange(12, 24).reshape(3, 4)
# [[12 13 14 15]
#  [16 17 18 19]
#  [20 21 22 23]]
print(t)


# 行交换
# 第二行和第三行交换
t[[1, 2], :] = t[[2, 1], :]
# [[12 13 14 15]
#  [20 21 22 23]
#  [16 17 18 19]]
print(t)


# 列交换
# 第一列和第三列交换
t[:, [0, 2]] = t[:, [2, 0]]
# [[14 13 12 15]
#  [22 21 20 23]
#  [18 17 16 19]]
print(t)

更多好用的方法

方法 描述
np.argmax(t,axis=None) 获取最大值的位置
np.argmin(t,axis=None) 获取最小值的位置
np.zeros((m,n)) 创建一个m行n列全为0的数组
np.ones((m,n)) 创建一个m行n列全为1的数组
np.eye(m) 创建一个对角线为1的m行m列的正方形数组(方阵)

随机数

均匀分布:在相同的大小范围内出现的概率是等可能的。

正态分布:呈钟型,两头低,中间高,左右对称。

均匀分布
正态分布
方法 描述
np.random.rand(d0,d1,...dn) 创建一个d0dn维度的均匀分布的随机数组,浮点数,范围01
np.random.randn(d0,d1,...dn) 创建一个d0~dn维度的标准正态分布随机数,浮点数,平均数0,标准差1
np.random.randint(low,high,(shape)) 给定上下限范围选取随机整数,范围是low~high,形状是shape
np.random.uniform(low,high,(size)) 产生具有均匀分布的数组,low起始值,high结束值,size形状
np.random.normal(loc,scale,(size)) 从指定正态分布中随机抽取样本,分布中心是loc(概率分布的均值),标准差是scale,形状是size
np.random.seed(s) 随机种子,s是给定的种子值,因为计算机产生的是伪随机数,所以通过设定相同的随机数种子,可以每次生成相同的随机数
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容

  • 基础篇NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(...
    oyan99阅读 5,115评论 0 18
  • 自学整理记录,大神见笑 为什么学习numpy 快速 方便 科学计算的基础库 什么是numpy 一个在Python中...
    岑洋阅读 2,621评论 0 0
  • 1. 什么是numpy numpy是一个在python中做科学计算的基础库,重在数值计算,也是大部分python科...
    Daily_Note阅读 709评论 0 0
  • To be continue NumPy(Numerical Python) 是 Python 语言的一个扩展程序...
    z761943阅读 1,631评论 1 7
  • 有人曾经和我说过 人与人之间的缘分很奇妙 始于声音 止于才华 忠于人品 于是我便开始相信 我们可以在一起走很远很远...
    一蓑烟雨任平生丨阅读 331评论 1 2