Numpy

目录

1、Numpy介绍

2、ndarray介绍

2.1ndarray和原生python效率对比

2.2 ndarray效率高的原因分析 

2.2.1 ndarray的内存块风格

2.2.2 ndarray支持并行化运算(向量化运算)

2.2.3 内部实现不同

3 ndarray的使用

3.1 ndarray数组的属性

3.2 数组的类型

3.3 数组的生成方法

3.3.1 生成0和1数组

3.3.3 从现有数组生成

3.3.4 生成固定范围的数组

3.3.5 创建随机数组   https://www.bilibili.com/video/BV1a7411d7fk?p=24

4 数组的基本操作

4.1 形状修改

4.2 类型修改

4.3 数组的去重

 5 数组计算

5.1 逻辑运算

5.2 通用判断函数

5.3 np.where(三元运算符)

5.4 统计运算

6 数组间的运算

6.1 数组与数之间的运算

6.2 数组与数组之间的运算

6.3 数组间运算的广播机制


1、Numpy介绍

  • Numpy用户快速处理任意维度的数组。
  • Numpy支持长概念的数组和矩阵操作。
  • Numpy使用ndarray对象来处理多维数组。

2、ndarray介绍

ndarray是一个N维数组类型,描述了相同类型的“iterms”的集合。

2.1ndarray和原生python效率对比

import numpy as np
import time
import random

a = []
for i in range(100000000):
    a.append(random.random())
time_1 = time.time()
sum_list = sum(a)
time1 = time.time()-time_1

b = np.array(a)
time_2 = time.time()
sum_array = np.sum(b)
time2 = time.time()-time_2

print(time1)
print(time2)

运行结果:

C:\Users\Administrator\Anaconda3\python.exe D:/PycharmProjects/model_study/test.py
0.7210443019866943
0.16411638259887695

Process finished with exit code 0

可见,ndarray比python原生列表的运行效率高很多。

2.2 ndarray效率高的原因分析 

2.2.1 ndarray的内存块风格

因此,ndarray存储的数据类型必须相同,而列表中存储的数据类型可以不同。

2.2.2 ndarray支持并行化运算(向量化运算)

numpy内置了并行运算功能,当系统有多个核心时,做某种计算时,numpy会自动进行并行计算。

2.2.3 内部实现不同

Numpy底层使用C语言编写,内部除了GIL(全局解释器),其对数组的操作不受python解释器的限制,所以其效率远高于纯python代码。

3 ndarray的使用

3.1 ndarray数组的属性

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

3.2 数组的类型

序号名称描述简写
1np.bool用一个字节存储的False布尔类型(True或False)‘b’
2np.int8一个字节大小,-128到127'i'
3np.int16整数,-32768到32767'i2
4np.int32整数,-2^31至2^32-1'i4'
5np.int64整数,-2^63至2……63-1'i8'
6np.unit8无符号整数,0至255'u'
7np.unit16无符号整数,0至65535'u2'
8np.unit32无符号整数,0至2^32-1'u4'
9np.unit64无符号整数,0至2^64-1'u8'
10np.float16半精度浮点数,16位,正负号1位,指数5位,精度10位'f2'
11np.float32单精度浮点数,32位,正负号1位,指数8位,精度23位'f4'
12np.float64双精度浮点数,64位,正负号1位,指数11位,精度52位'f8'
13np.complex64复数,分别用两个32位浮点数表示实部和虚部'c8'
14np.complex128复数,分别用两个64位浮点数表示实部和虚部'c16'
15np.object_python对象'O'
16np.string_字符串'S'
17np.unicode_Unicode类型'U'

3.3 数组的生成方法

3.3.1 生成0和1数组

np.ones(shape,dtype)

np.ones_like(a.dtype)

np.zeros(shape,dtype)

np.zeros_like(a.dtype)

3.3.3 从现有数组生成

np.array(object,dtype)      # (类似)深拷贝

np.asarray(a,dtype)         # (类似)浅拷贝

import numpy as np

a = np.array([[1,2,3],[4,5,6]])
print('a:',a)
a1 = np.array(a)
print('a1:',a1)
a2 = np.asarray(a)
print('a2:',a2)
print('************************')
a[0,0] = 100
print('a:',a)
print('a1:',a1)
print('a2:',a2)

运行结果

C:\Users\Administrator\Anaconda3\python.exe D:/PycharmProjects/model_study/test.py
a: [[1 2 3]
 [4 5 6]]
a1: [[1 2 3]
 [4 5 6]]
a2: [[1 2 3]
 [4 5 6]]
************************
a: [[100   2   3]
 [  4   5   6]]
a1: [[1 2 3]
 [4 5 6]]
a2: [[100   2   3]
 [  4   5   6]]

Process finished with exit code 0

3.3.4 生成固定范围的数组

创建等差数组 -- 指定数量

np.linspace(start,stop,num,endpoint)                   

参数

  •     start:序列的起始值
  •     stop:序列的终止值
  •     num:要生成的等间隔样例数量,默认为50
  •     endpoint:序列中是否包含stop值,默认为true

 创建等差数组 -- 指定步长

np.arange(start,stop,step,dtype)

参数

  •     step:步长,默认为1

 创建等比数列

np.logspace(start,stop,num)

参数

  •     num:要生成的等比数列数量,默认为50
import numpy as np
a = np.logspace(0,2,3)
print(a)

 输出结果

C:\Users\Administrator\Anaconda3\python.exe D:/PycharmProjects/model_study/test.py
[  1.  10. 100.]

Process finished with exit code 0

3.3.5 创建随机数组   https://www.bilibili.com/video/BV1a7411d7fk?p=24

使用np.random模块

正态分布(用的更多)

np.random.normal()

均匀分布

np.random.uniform() 

4 数组的基本操作

数组的索引和切片

4.1 形状修改

ndarray.reshape(shape,order)

  • 返回一个具有相同数据域,但shape不一样的视图
  • 行、列不进行互换

ndarray.resize(new_shape)

  • 修改数组本身的形状,需要保持元素个数前后相同
  • 行、列不进行互换

ndarray.T

  • 数组的转置
  • 将数组的行列进行互换

4.2 类型修改

ndarray.astype(type)

返回修改了类型之后的数组

ndarray.tostring([order])或者ndarray.tobytes([order])

构造包含数组中原始数据字节的python字节

4.3 数组的去重

np.unique(array)

去除数组中的重复元素,并进行排序后输出(返回的都是一个一维数组?) 

 5 数组计算

5.1 逻辑运算

5.2 通用判断函数

  • np.any()   
    • 判断一个tuple或者list是False否全部为空(0,False),如果全为空则返回False,如果不全为空,则返回True
  • np.all()
    • 判断一个tuple或者list是否全部不为空(1,True),如果全部不为空则返回Ttue,否则返回False。

5.3 np.where(三元运算符)

  • np.where(np.logical_or(a,b),符合条件的结果,不符合条件的结果)
  • np.where(条件,符合条件的结果,不符合条件的结果)
  • np.where(np.logical_and(a,b),符合条件的结果,不符合条件的结果)

5.4 统计运算

统计指标
统计指标指标释义
min(a,sxis)返回数组的最小值或某行/某列上的最小值
max(a,sxis)返回数组的最大值或某个轴上的最大值
median(a,sxis)计算沿指定轴上的中位数
mean(a,sxis,dtype)计算沿指定轴上的算术平均值
std(a,sxis,dtype)计算沿指定轴的标准偏差
var(a,sxis,dtype)计算沿指定轴的方差

对于axis不怎么友好,0/1有时候是行,有时候是列,用的时候试试到底是行还是列。

  • np.argmin(array,axis=0/1)   # 求取行或列上的最小值对应的坐标
  • np.argmax(array,axis=0/1)   # 求取行或列上的最大值对应的坐标

6 数组间的运算

6.1 数组与数之间的运算

  • 对数组中的每个元素进行相应的计算

注意:区分列表与数的计算

a = [1,2,3]
b = a * 3
print(a,'\n',b)

运行结果

C:\Users\Administrator\Anaconda3\python.exe D:/PycharmProjects/model_study/test.py
[1, 2, 3] 
 [1, 2, 3, 1, 2, 3, 1, 2, 3]

Process finished with exit code 0

6.2 数组与数组之间的运算

arr1 = np.array([[1,2,3,2,1,4],[5,6,1,2,3,4]])

arr2 = np.array([[1,2,3,4],[5,6,3,4]])

注意:arr1与arr2之间不能进行数组间运算  --  广播机制

6.3 数组间运算的广播机制

广播机制就是数组之间运算需要满足的要求:数组在进行矢量化运算时,要求数组的形状是相等的。

import numpy as np

arr1 = np.array([[0],[1],[2],[3]])
print(arr1.shape)

arr2 = np.array([1,2,3])
print(arr2.shape)

print(arr1+arr2)

运行结果

C:\Users\Administrator\Anaconda3\python.exe D:/PycharmProjects/model_study/test.py
(4, 1)
(3,)
[[1 2 3]
 [2 3 4]
 [3 4 5]
 [4 5 6]]

Process finished with exit code 0

上述代码中,数组arr1是4行1列,arr2是1行3列,这两个数组要进行相加,按照广播机制会对数组arr1和arr2都进行扩展,使得数组arr1和arr2都变成4行3列。

广播机制扩展数组的过程图:

广播机制实现了对两个或两个以上数组的运算,即使这些数组的shape不是完全相同的,只要满足如下任意一个条件即可:

  • 数组的某一维度等长;
  • 其中一个数组的某一维度为1。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值