python进阶-03-numpy

2020-03-15  本文已影响0人  西海岸虎皮猫大人

1 概述

科学计算基础库,提供大量科学计算功能
核心类型ndarray(多维数组)
支持向量处理
底层是c写的,效率高

安装

pip install numpy
报错:

Could not find a version that satisfies the requirement numpy (from versions: )...

根据提示,执行:

python -m pip install --upgrade pip

下载速度较慢
重新执行:

pip install numpy

依然较慢
配置阿里云镜像,参考:
https://www.cnblogs.com/ipaomi/p/7798223.html

第一行程序
# coding=utf-8
import numpy as np
a = np.arange(10)
print(a)
# 类型ndarray
print(type(a))
# 对每个元素开平方
# 传统方式需要遍历,开平方,然后存入列表
# 使用numpy进行向量处理
b = np.sqrt(a)
print(b)

2 创建数组

# array创建
可将列表创建为ndarray
import numpy as np

# 创建一维数组
a = np.array([1,2,3,4])
print(a)
print(type(a))b

# 创建二维数组
b = np.array([[1,2,3], [4,5,6],[7,8,9]])
print(b)

# 三维以上类似
# array中dtype的使用
# 设置数组中元素的类型
d = np.array([3,4,5], dtype=float)

# ndim指定维度
# 3维
e = np.array([5,6,7], ndim=3)

3 arange创建数组

import  numpy as np
# arange创建数组
# 与range类似(start,end,step) 左闭右开,步长为1
# 1-10
a = np.arange(1,11)
# 1-10 步长2
b = np.arange(1,11,2)
# 指定元素类型为浮点型
c = np.arange(10,20,2,dtype=float)

4 随机创建数组

random随机数创建
import numpy as np
# 使用random创建一维数组,元素取值[0.0,1.0)
a = np.random.random(size=5)
print(a)

# 使用random创建二维数组
b = np.random.random(size=(3,4))
print(b)
随机整数
# 0-5之间随机整数
c = np.random.randint(6, size=10)
print(c)

# 5-10之间,二维,4行3列,高维类似
d = np.random.randint(5,11, size=(4,3))

5 指定元素类型 | 标准正态分布

指定元素类型dtype
# 指定元素类型,默认np.int
e  = np.random.randint(10,size=5,dtype=np.int64)
# 打印元素类型
print(e.dtype)
创建标准正态分布
# 1维,4个元素
a = np.random.randn(4)
print(a)
# 2维,2行3列,高维类似
a = np.random.randn((2,3))
指定方差和期望
# 1维5个数,期望默认为loc=0.0,方差scale=1.0
a = np.random.normal(size=5)
# 指定期望和方差
# 期望2,方差3,2维3行4列
b = np.random.normal(loc=2,scale=3,size=(3,4))

6 ndarray对象属性

常用属性

ndim 维度
shape 形状
size 元素总个数等
...
参考文档

import numpy as np

# 创建1维数组
a = np.array([1,2,3,4])
# 创建2维数组
b = np.random.randint(4,10,size=(2,3))
# 创建3维数组
c = np.random.randn(2,3,4)

# 维度
print('ndim', a.ndim,b.ndim,c.ndim)
# 形状
print('shape', a.shape,b.shape,c.shape)
# 元素类型
print('dtype', a.dtype,b.dtype,c.dtype)
# 总个数
print('size', a.size,b.size,c.size)
# 元素对象大小
print('itemsize', a.itemsize,b.itemsize,c.itemsize)

7 其他创建数组方式

0元素数组 - zeros
import numpy as np

# 5个元素,每个元素都是浮点数0.0
np.zeros(5)
# 指定类型为整数
np.zeros((5,), dtype=int)
# 2维
np.zeros((3,4))
1元素数组 - ones
np.ones(10)
np.ones((2,5), dtype=int)
empty

元素的值是之前内存的值,未初始化
empty创建效率更高

a = np.empty(8)
a = np.empty((3,4))
等差数列 - linespace
# 1到10 10个元素等差数列
np.linespace(1,10,10)
# 包含末尾元素20, 5到20, 5个元素的等差数列
np.linespace(5,20,5,endpoint=True)
等比数列 - logspace
# 0到9, 10个元素,以2为基数 
np.logspace(0,9,10,base=2)

8 切片 | 索引

# 创建1维数组
x = np.arange(10)
# 索引0处元素
print(x[0])
# 负索引 倒数第3个
a[-3]
# 切片
# 开始到结尾
a[:]
# 索引3开始到结尾
a[3:]
# 索引3到4
a[3:5]
# 索引1到6,步长为2
a[1:7:2]
# 负索引切片
# 反向获取
a[::-1]
# 倒数5到倒数2
a[-5:-2]

9 二维数组切片索引

二维数组索引
# 1-12
x = np.arange(1,13)
# 转为4行3列2维数组
a = x.reshape((4,3))
print(a)
# 获取第一行
print(a[1])
# 获取第3行第2列
print(a[2][1])  
二维数组切片
# [行切片,列切片]
# 所有行所有列 
a[:, :]
# 所有行第2列
a[:, 1]
# 所有行第1-2列
a[:, 0:2]
# 奇数行所有列
a[::2, :]
# 奇数行第1,2列
a[::2, 0:2]
# 同时获取第3行第4列和第2行第1列
a[(2,3), [1,0]]
# 或者
np.array[a[1,2],[1,0]]
# 负索引
# 最后一行
a[-1]
# 行倒序
a[::-1]
# 行列倒序
a[::-1,::-1]

10 数组的复制

# 1-12 转为3行4列
a = np.arange(1,13).reshape(3,4)
# 切片,前2行前2列
sub_a = a[:2,:2]
print(sub_a)
# 修改元素值
sub_a[0][0] = 100
print(sub_a)
# 修改子数组元素会同时影响原数组,浅拷贝
print(a)

# copy实现深拷贝
sub_aa = np.copy(a[:2,:2])
sub_aa[0][0] = 200
print(sub_aa)
# 不会影响原数组元素的值
print(a)

11 改变数组维度

# 1-24
a = np.arange(1,25)
# 修改为2维,参数也可传元组
b = a.reshape(2,12)
# 修改为3维
c = a.reshape((2,3,4))
# 通过np.reshape修改
d = np.reshape(a, (2,12))
# 多维修改为1维,需要计算总元素个数
e = d.reshape(24)
# 转为1维
f = d.reshape(-1)
# ravel转为1维
g = b.ravel()
# flatten转为1维
h = b.ravel()

12 数组的拼接

水平拼接和垂直拼接
a = np.array([1,2,3],[4,5,6])
b = np.array([11,12,13],[14,15,16])
# 水平拼接,参数可以为列表或元组
r = np.hstack([a,b])
print(r)
# 垂直拼接
v = np.vstack([a,b])
print(v)
不同维度拼接 - concatenate
# 默认垂直方向axis=0相当与vstack
# axis=1水平拼接
r1 = np.concatenate((a,b), axis=1)
print(r2)

# 三维数组 axis = [0 1 2]
a = np.arange(1,13).reshape(1,2,6)
b = np.arange(101,113).reshape(1,2,6)

# 按照不同维度拼接
r1 = np.concatenate((a,b))
r2 = np.concatenate((a,b), axis=1)
r2 = np.concatenate((a,b), axis=2)

13 数组的分割

x = np.arange(1,9)
# 1维数组平均分为4份
a = np.split(x,4)
# 按照位置分割0,1,2| 3,4 | 5,6,7,8
b = np.split(x, [3,5])

# 二维数组分割
a = np.array([1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16])
# axis=0 垂直方向平均分割
np.split(a,2,axis=0)
# 垂直方向 按位置分割
np.split(a, [2,3], axis=0)
# 水平方向 平均分割
np.split(a, 2, axis=1)
# 水平方向 按位置
np.split(a, [3], axis=1)

# hsplit 水平分割 按位置分割同上
np.hsplit(a, 2)
# vsplit 垂直分割
np.split(a, 2)

14 数组的转置

a = np.arange(1,25).reshape(3,8)
# 数组转置
b = a.transpose()
print(b, b.shape)

# 可以使用.T
print(a.T)

c = np.transpose(a)

# 多维数组转置
a = a.reshape(2,3,4)
b = np.transpose(a)
print(b, b.shape)
# 转置维3,4,2形状
c = np.transpose(a, (1,2,0))
print(c, c.shape)

15 函数

加减乘除
a = np.arange(9, dtype=np.float).reshape(3,3)
b = np.array([10,10,10])
# 加
print(np.add(a,b))
print(a+b)
# 减
print(np.substract(b,a))
print(b-a)

# 乘
y = np.empty((3,3), dtype=np.int)
np.multiply(a, 10, out=y)
三角函数
a = np.array([0,30,60,90])
print(np.sin(a))
取整

around 四舍五入
cell 向下取整
floor 向下取整

统计函数

求和 平均值 对数 幂 方差 标准差等,详见文档

上一篇下一篇

猜你喜欢

热点阅读