1h About Numpy
How are lists different from Numpy?
Numpy is faster than list, because the numpy use
continue memory.
lists 中的信息会分布散落在内存中,如果信息是不相邻的话,你必须弹跳,
快速遍历潜在地所有对象上执行功能
numpy 使用的是连续内存,
例子:
import numpy as np
a = np.array ([1,3,5])
b = np.array ([1,2,3])
a*b
array([ 1, 6, 15])
1 * 1, 3 * 2 , 5 * 3 —> 1 , 6 , 15 GET
b= np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
print(b)
[[[1 2]
[3 4]]
[[5 6]
[7 8]]]
b[0,1,:]
array([3, 4])b[::-1] #数组倒序
Numpy Ndarray 对象
ndarray 对象是用于存放同类元素的多维数组
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
object | 数组或嵌套的数列 |
---|---|
dtype | 数组元素的数据类型,可选 |
copy | 对象是否需要复制,可选 |
order | 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认) |
subok | 默认返回一个与基类类型一致的数组 |
ndmin | 指定生成数组的最小维度 |
Numpy 数组属性
ndarray.ndim | 秩,即轴的数量或维度的数量 |
---|---|
ndarray.shape | 数组的维度,对于矩阵,n 行 m 列 |
** 从数值范围创建数组
numpy.arange( start , stop , step . dtype)
start | 起始值,默认为0 |
---|---|
stop | 终止值(不包含) |
step | 步长,默认为1 |
dtype | 返回ndarray 的数据类型,如果没有提供,则会使用输入数据的类型。 |
** 创建一个一维数组 [等差数列]
np,linspace( start , stop , num = 50 , endpoint = True , restep = False , dtype = None)
start | 序列的起始值 |
---|---|
stop | 序列的终止值,如果endpoint 为true ,该值包含于数列中 |
num | 要生成的等步长的样本数量,默认为50 |
endpoint | 该值为 true 时,数列中包含stop 值,反之不包含,默认是True。 |
retstep | 如果为 True 时,生成的数组中会显示间距,反之不显示。 |
dtype | ndarray 的数据类型 |
** 创建等比数列
np.logspace( start , stop , num = 50 , endpoint = True , base = 10.0 , dtype = None)
** 切片
冒号分隔切片参数 start:stop:step
切片还可以包括省略号 … ,来选择元组的长度与数组的维度相同。如果再行位置使用省略号,它将包含行中元素的ndarray
import numpy as np
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print (a[...,1]) # 第2列元素
print (a[1,...]) # 第2行元素
print (a[...,1:]) # 第2列及剩下的所有元素
**索引
用 ~ (取补运算符)过滤NAN
a = np.array([np.nan, 1,2,np.nan,3,4,5])
print (a[~np.isnan(a)])
过滤掉非复数元素
a1 = np.array([1, 2+6j, 5, 3.5+5j])
print(a1[np.iscomplex(a1)])
numpy迭代器对象: numpy nditer
b = np.arange(0 ,60 ,5)
b = b.reshape( 3,4 )
print(b)
print(b.T ) #打印转置
##列序优先
for x in np.nditer( b , order= 'F'):
print(x , end= ',')
print('\n')
##行序优先
for x in np.nditer( b.T , order= 'F'):
print(x , end= ',')
Nmupy 数组操作
修改数组形状
函数 | 描述 |
---|---|
reshape | 不改变数据的条件下修改形状 |
flat | 数组元素迭代器 |
flatten | 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组 |
ravel | 返回展开数组 |
**numpy.ndarray.flat 数组元素迭代器
d = np.arange(9).reshape( 3 , 3)
print('原始数组')
for row in d:
print(row)
print('迭代后数组')
for element in d.flat:
print(element)
翻转数组
函数 | 描述 |
---|---|
transpose | 对换数组的维度 |
ndarray.T | 和 self.transpose() 相同 |
rollaxis | 向后滚动指定的轴 |
swapaxes | 对换数组的两个轴 |
numpy.transpose 用于对换数组的维度 相当于 numpy.ndarray.T
修改数组维度
维度 | 描述 |
---|---|
broadcast | 产生模仿广播的对象 |
broadcast_to | 将数组广播到新形状 |
expand_dims | 扩展数组的形状 |
squeeze | 从数组的形状中删除一维条目 |
** numpy.broadcast 用于模仿广播的对象,它返回一个对象 该对象封装了将一个数组广播到另一个数组的结果
该函数使用两个数组作为输入参数
import numpy as np
x = np.array([[1], [2], [3]])
y = np.array([4, 5, 6])
# 对 y 广播 x
b = np.broadcast(x,y)
# 它拥有 iterator 属性,基于自身组件的迭代器元组
print ('对 y 广播 x:')
r,c = b.iters
# Python3.x 为 next(context) ,Python2.x 为 context.next()
print (next(r), next(c))
print (next(r), next(c))
print ('\n')
# shape 属性返回广播对象的形状
print ('广播对象的形状:')
print (b.shape)
print ('\n')
# 手动使用 broadcast 将 x 与 y 相加
b = np.broadcast(x,y)
c = np.empty(b.shape)
print ('手动使用 broadcast 将 x 与 y 相加:')
print (c.shape)
print ('\n')
c.flat = [u + v for (u,v) in b]
print ('调用 flat 函数:')
print (c)
print ('\n')
# 获得了和 NumPy 内建的广播支持相同的结果
print ('x 与 y 的和:')
print (x + y)
分割数组
函数 | 数组及操作 |
---|---|
split | 将一个数组分割为多个子数组 |
hsplit | 将一个数组水平分割为多个子数组(按列) |
vsplit | 将一个数组垂直分割为多个子数组(按行) |
** numpy.split
numpy.split(ary, indices_or_sections, axis)
indices_or_sections
:果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭)
e = np.split(np.arange(9) ,[4,7]) #在 ,4和7的地方分开
f = np.split(np.arange(9) ,3)
数组元素的添加与删除
函数 | 元素及描述 |
---|---|
resize | 返回指定形状的新数组 |
append | 将值添加到数组末尾 |
insert | 沿指定轴将值插入到指定下标之前 |
delete | 删掉某个轴的子数组,并返回删除后的新数组 |
unique | 查找数组内的唯一元素 |
** numpy.append
在数组的末尾添加值。追加的操作会分配给整个数组
numpy.append(arr, values, axis=None)
c = np.array([[1,1 ,1],[2,2,2],[3,3,3]])
f = np.append(c, [7,8,9])
f1 = np.append(c, [[7,8,9]], axis = 0)
f2 = np.append(c, [[4,0,4],[7,8,9],[5 ,0,5]], axis = 1)
print(f)
print(f1)
print(f2)
Numpy 字符串函数
在字符数组类(numpy.char)中定义
函数 | 描述 | |
---|---|---|
add() | 对两个数组的逐个字符串元素进行连接 | np.char.add([‘add’],[‘add’]) |
multiply() | 返回按元素多重连接后的字符串 | np.char.multiply('Runoob ',3) |
center() | 居中字符串 | np.char.center(‘Runoob’, 20,fillchar = ‘*’) |
capitalize() | 将字符串第一个字母转换为大写 | np.char.capitalize(‘runoob’) |
title() | 将字符串的每个单词的第一个字母转换为大写 | np.char.title(‘runoob’) |
lower() | 数组元素转换为小写 | |
upper() | 数组元素转换为大写 | np.char.upper(‘runoob’) |
split() | 指定分隔符对字符串进行分割,并返回数组列表 | np.char.split (‘www.runoob.com’, sep = ‘.’) |
splitlines() | 返回元素中的行列表,以换行符分割 | np.char.splitlines(‘i\nlike runoob?’) |
strip() | 移除元素开头或者结尾处的特定字符 | # 移除字符串头尾的 a 字符 print (np.char.strip(‘ashok arunooba’,‘a’)) # 移除数组元素头尾的 a 字符 print (np.char.strip([‘arunooba’,‘admin’,‘java’],‘a’)) |
join() | 通过指定分隔符来连接数组中的元素 | #操作字符串 print (np.char.join(’:’,‘runoob’))# 指定多个分隔符操作数组元素print (np.char.join([’:’,’-’],[‘runoob’,‘google’])) |
replace() | 使用新字符串替换字符串中的所有子字符串 | |
decode() | 数组元素依次调用str.decode | |
encode() | 数组元素依次调用str.encode |
Nmupy 数学函数
** 三角函数 sin() cos() tan() arcsin( ) arccos() arctan()
** numpy.degrees() 将角度转化为弧度
Nmupy 算术函数
Numpy排序、条件刷选函数
种类 | 速度 | 最坏情况 | 工作空间 | 稳定性 |
---|---|---|---|---|
'quicksort' (快速排序) | 1 | O(n^2) | 0 | 否 |
'mergesort' (归并排序) | 2 | O(n*log(n)) | ~n/2 | 是 |
'heapsort' (堆排序) | 3 | O(n*log(n)) | 0 | 否 |
** numpy.sort( ) 返回输入数组的排序副本。
** numpy.argsort( ) 数组值从小到大的索引值
详细描述-> 链接: https://www.runoob.com/numpy/numpy-sort-search.html
numpy.lexsort()
numpy.lexsort() 用于对多个序列进行排序。把它想象成对电子表格进行排序,每一列代表一个序列,排序时优先照顾靠后的列。
这里举一个应用场景:小升初考试,重点班录取学生按照总成绩录取。在总成绩相同时,数学成绩高的优先录取,在总成绩和数学成绩都相同时,按照英语成绩录取…… 这里,总成绩排在电子表格的最后一列,数学成绩在倒数第二列,英语成绩在倒数第三列
NumPy 线性代数
NumPy 提供了线性代数函数库 linalg,该库包含了线性代数所需的所有功能,可以看看下面的说明:
函数 | 描述 |
---|---|
dot | 两个数组的点积,即元素对应相乘。 |
vdot | 两个向量的点积 |
inner | 两个数组的内积 |
matmul | 两个数组的矩阵积 |
determinant | 数组的行列式 |
solve | 求解线性矩阵方程 |