Python __ NumPy

概述

NumPy(Numerical Python)
是 Python 进行数值计算最重要的第三方模块。
需要引入模板import numpy as np
优点:

  • 大部分代码是用 C 或者 Fortran 实现的,运行速度比纯 Python 代码要快。
  • 不需要使用 for 或者 while 循环就可以完成整个数组的运算。

ndarray

是一种 N 维数组对象
是NumPy中存储和处理数据的数组对象。

特点:

  • 可以定义维度, 适合做代数运算。
  • 是标量元素之间的运算。
  • 做运算是会自动迭代到数组内的所有元素
  • 要求所有元素的数据类型是一致的,用dtype属性限制。
import numpy as np
rate_array = np.array([680.6, 800.05, 882.6, 87.79])
np.round((100000 * 100) / rate_array)

array([ 14693., 12499., 11330., 113908.])

属性

dtype 属性:表示数组的数据类型。
常用属性:
image
ndim 属性: ndim 属性用来查看数组的维数。

shape 属性: 通过 shape 属性得到的是数组的形状。

>>>n_array = np.ones((3,4))
>>>n_array.shape
输出:(3, 4)

“ : ”使用

[i:j:k]
表示从索引 i 到 j(不包含j)的这个区间内的元素,当k为正整数时,表示每k个取一次,当k为负整数的时候,表示每k个取一次,但是时倒着取

  • a[::2] i 和 j 同时省略,表示所有元素,每2个元素取一个
  • a[:4:1] i 省略,表示从第一个元素到第3下标元素的这个区间,于是得到了 [1 2 3 4]
  • a[2::1] j 省略,表示从第2下标元素到最后一个元素,于是得到了 [3 4]
    原文

创建

array() 方法
将列表、元组、数组或其他序列类型转换为 ndarray 数组。
格式:

float_array = np.array([1, 2, 3, 4, 5], dtype=np.float64)
int_array = np.array([1, 2, 3, 4, 5])

arange() 方法:
range()函数类似

格式:
arange([start,] stop[, step,], dtype=None)
start 是可选参数, 代表起始值, 默认值为 0
stop 必须填写,代表截止值, 结果中并不包含该值;
step 是可选参数, 设置的是步长;
dtype 设置数据类型, 默认为 None 值,NumPy 将推测数组的数据类型。

ones()、zeros()、empty() 和 full() 方法
均可以接受一个元组作为数组的形状且 dtype 指定数据类型。
ones() 方法:产生全 1 数组。
zeros() 方法:产生全 0 数组。
empty() 方法:产生新数组,只分配空间不填充任何值。
full() 方法:利用指定值填充产生的数组。

格式:

np.ones((2, 3)) //2行3列
np.zeros((2, 3), dtype=np.int32)
np.full((2, 2), 5) //2行2列 用5填充

访问数组元素

普通索引

  1. 通过下标索引(整数索引)

close_price[0][1]

2.将每个维度的索引值列在中括号中的方式来获取对应位置的元素:

close_price[0, 1]//0行1列

切片

切片用于获取数组中的一小块数据。
Python 内置列表的切片相似:
close_price[0:2, 0::2]
用冒号连接给出切片起始位置、截止位置(不包含)和步长。

在对切片赋值时,可以将一个标量/数组/列表值赋给切片,这样的赋值操作会被扩散到整个切片 区域:

>>>close_price[:, -2] = 0
>>>close_price
array([[3.22, 3.21, 3.2, 0. , 3.2],
[3.19, 3.16, 3.17, 0. , 3.15],
[4.96, 4.93, 4.92, 0. , 4.89],
[6.21, 6.19, 6.13, 0. , 6.2]])

也可以使用数组或列表对切片赋值。数组或列表的形状与切片的形状一致或者 可广播(广播指的是不同形状的 NumPy 数组之间运算的执行方式)

>>>close_price[:, -2] = [3.19, 3.15, 4.9, 6.17]
>>>close_price
array([[3.22, 3.21, 3.2 , 3.19, 3.2 ],
[3.19, 3.16, 3.17, 3.15, 3.15],
[4.96, 4.93, 4.92, 4.9 , 4.89],
[6.21, 6.19, 6.13, 6.17, 6.2 ]]))

布尔索引

NumPy数组的比较运算是矢量化的,
即数组和标量进行比较时,得到的是数组中每个元素与标量比较结果组成的布尔数组。

>>>bank_array = np.array(['中国银行', '农业银行', '工商银行', '建设银行'])
>>>bank_array == '农业银行'
array([False, True, False, False])

可以将这个布尔型的数组用于数组索引。

>>>close_price[bank_array=='农业银行']
array([[3.19, 3.16, 3.17, 3.15, 3.15]]) //匹配该关键字的行的数据

可以使用 &(和)、|(或)之类的布尔运算符组合多个条件。
布尔索引也可以用于设置数组中特定元素的值。

花式索引

花式索引是利用整数列表对数据进行索引。只需要传入一个用于指定顺序的整数列表或 ndarray 数组,就可以得到按照特定顺序选取的子集。

>>>bank_array = np.array(['中国银行', '农业银行', '工商银行', '建设银行'])
>>>bank_array[[3,2,1]]
array(['建设银行', '工商银行', '农业银行'], dtype='<U4'))

应用

获取大小在10~15的数据

def get10_15():
    int_array=np.random.randint(0,15,10)
    print(int_array)
    index1=np.where((int_array>=10)&(int_array<=15))
    print( int_array[index1] )
get10_15()

输出反转的二位数组的列

def getfjvr():
    int_array=np.arange(1,60,2,dtype=int)
    print(int_array)
    int_array.resize((4,5))
    print(int_array) 
    # int_array[:,[-1,0]]=int_array[:,[0,-1]]
    print(int_array) 
    b=int_array[:,-1::-1]
    print(b)
getfjvr()

找到一维数组的所有峰值

def getpeak():
    int_array=np.random.randint(0,100,10)
    print(int_array)
    print("---------------")
    print(int_array[np.where(np.sign(np.diff(int_array))==-1)])  
    print("---------------")
    # 即:
    maxn=np.diff(int_array)# 将峰值设为负数 后一项-前一项<0 即为峰值
    maxid=np.sign(maxn)# 找到负数
    peak_loc=np.where(maxid==-1)# 找到负数的下表
    print(int_array[peak_loc])

getpeak()
posted @ 2022-04-12 10:58  kingwzun  阅读(74)  评论(0编辑  收藏  举报