文章目录
- NumPy - Ndarray 对象
- 数组类型
- NumPy - 数组属性
- 创建数组
- 索引和切片
- 索引
- 切片
- 高级索引
- 整数索引
- 布尔索引
- 数组操作
- 修改数组形状
- 翻转数组
- 修改数组维度
- 对数组进行广播运算
- 连接数组
- 分割数组
- 数组的添加和删除
- 数组排序
- 函数
- 字符串函数
- 数学函数用法
- 算数函数
- 矩阵
- 空矩阵
- 0矩阵
- 全1矩阵
- 单位矩阵,对角线为1
- 对角阵
- 随机矩阵
NumPy - Ndarray 对象
NumPy 中定义的最重要的对象是称为 ndarray 的 N 维数组类型。 它一系列相同类型的元素集合。以0下标作为索引的起点
- 用array函数创建即可:
def array(p_object, dtype=None, copy=True, order=‘K’, subok=False, ndmin=0):
名称 | 描述 |
p_object | 数组或嵌套的数列 |
dtype | 数组的所需数据类型,可选 |
copy | 可选,默认为true,对象是否被复制 |
order | C(按行)、F(按列)或A(任意,默认) |
subok | 默认情况下,返回的数组被强制为基类数组。 如果为true,则返回子类 |
ndmin | 指定返回数组的最小维数 |
例1:创建一个一维数组
import numpy as np
a = np.array([1,2,3])
print(a)
例2:创建一个二维数组
data1 = [[1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10]]
b = np.array(data1)
print(b)
- 查看数组维度
# 查看数组维度
print(b.ndim)
- 数组类型
# 数组类型
c = np.array([1, 2, 3, 4, 5])
print(c)
print(c.dtype)
数组类型
NumPy 支持比 Python 更多种类的数值类型。 下表显示了 NumPy 中定义的不同标量数据类型,常见的,还有很多没有列举
名称 | 描述 |
bool_ | 存储为一个字节的布尔值(True或False) |
int_ | 默认整数,相当于 C 的long,通常为int32或int64 |
nt8 | 字节(-128 ~ 127) |
int16 | 16 位整数(-32768 ~ 32767) |
int32 3 | 2 位整数(-2147483648 ~ 2147483647) |
int64 | 64 位整数(-9223372036854775808 ~ 9223372036854775807) |
NumPy - 数组属性
- ndim(维度),shape(几行几列),size(元素总个数),dtype(数据类型),itemsize(每个元素的字节数),flags(对象的内存信息),real(元素的实部),imag(元素的虚部),date(实际元素缓冲区,一般不用)
例:
import numpy as np
#生成25个数据,并定义为5行5列
a = np.arange(25, dtype = np.float).reshape(5,5)
b = np.array([1,2,3,4,5])
print(a)
print(b)
#数组a的属性
print(a.ndim)
print(a.shape)
print(a.size)
print(a.dtype)
print(a.itemsize)
创建数组
- 0元素数组
# 1:0元素数组
import numpy as np
e = np.zeros(5)
print(e)
- 1元素数组
# 1元素数组
import numpy as np
s1 = np.ones(5)
print(s1)
- 创建5维数组
# 创建5维数组
s2 = np.ones([5,5], dtype = float)
print(s2)
- arange用法:numpy.arange(start, stop, step, dtype)
arr = np.arange(10)
print(arr)
arr2 = np.arange(-10,10,2)
print(arr2)
arr3 = np.arange(-10,10,2,dtype=float)
print(arr3)
- 等差数列数组linspace
此函数类似于arange()函数。 在此函数中,指定了范围之间的均匀间隔数量,而不是步长
numpy.linspace(start, stop, num, endpoint, retstep, dtype)
start 序列的起始值
stop 序列的终止值,如果endpoint为true,该值包含于序列中
num 要生成的等间隔样例数量,默认为50
endpoint 序列中是否包含stop值,默认为ture
retstep 如果为true,返回样例,以及连续数字之间的步长
dtype 输出ndarray的数据类型
例:
import numpy as np
a = np.linspace(0,5,6)
print(a)
endpoint设置为True则不包括终点
import numpy as np
a2 = np.linspace(0,5,6,endpoint = False)
# 设置为True则不包括终点
print(a2)
- 等比数列数组;logspace
此函数返回一个ndarray对象,其中包含在对数刻度上均匀分布的数字。 刻度的开始和结束端点是某个底数的幂,通常为 10
numpy.logscale(start, stop, num, endpoint, base, dtype)
start 起始值是base ** start
stop 终止值是base ** stop
num 范围内的数值数量,默认为50
endpoint 如果为true,终止值包含在输出数组当中
base 对数空间的底数,默认为10
dtype 输出数组的数据类型,如果没有提供,则取决于其它参数
例:
import numpy as np
a = np.logspace(1,10,10,base=2)
print(a)
import numpy as np
a = np.logspace(3,10,8,base=2)
# 相当于从2**3和2**10的数,之间找出8个的等比数数列
print(a)
print(len(a))
索引和切片
索引
- 一维数组
import numpy as np
# 随机生成数组
a = np.random.randn(6)
print(a)
- 获取第3个元素
print(a[2])
- 获取最后一个元素
print(a[-1])
获取第2个和第5个元素
print(a[[1,4]])
- 二维数组
import numpy as np
# 二位数列索引
b=np.arange(16).reshape(4,4)
print(b)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
第二行第三列:7
print(b[1,3])
获取第二行以后的第4列的所有元素:[ 7 11 15]
print(b[1:,3])
获取第二行前三列数据:[4 5 6]
print(b[1,:3])
切片
- 一维数组
c = np.arange(10)
print(c)
print(c[1:6])
- 二维数组
d=np.arange(16).reshape(4,4)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
获取数组d的第一行元素
print(d[0,:])
[0 1 2 3]
获取数组d的第一列元素
print(d[:,0])
[ 0 4 8 12]
或者用:print(d[1,...])
print(d[1:3,1:3])
[[ 5 6]
[ 9 10]]
若要提取的行或者列的索引不是连续的,可以指定索引数组
print(d[[1,3],1:3])
[[ 5 6]
[13 14]]
切片还可以包括省略号(…),来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的ndarray,
高级索引
如果一个ndarray是非元组序列,数据类型为整数或布尔值的ndarray,或者至少一个元素为序列对象的元组,我们就能够用它来索引ndarray。高级索引始终返回数据的副本。 与此相反,切片只提供了一个视图
有两种类型的高级索引:整数和布尔值
整数索引
基于 N 维索引来获取数组中任意元素。 每个整数数组表示该维度的下标值,
行索引包含所有行号,列索引指定要选择的元素
import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6]])
print(x)
[[1 2]
[3 4]
[5 6]]
y = x[[0,1,2], [0,1,0]]
print(y)
[1 4 5]
布尔索引
大于 5 的元素会作为布尔索引的结果返回
import numpy as np
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print(x)
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
print(x[x > 5])
[ 6 7 8 9 10 11]
- 过滤NaN
import numpy as np
a = np.array([np.nan, 1,2,np.nan,3,4,5])
print(a[~np.isnan(a)])
[1. 2. 3. 4. 5.]
从数组中过滤掉非复数元素
import numpy as np
a = np.array([1, 2+6j, 5, 3.5+5j])
print(a[np.iscomplex(a)])
[2. +6.j 3.5+5.j]
数组操作
修改数组形状
# 修改数组形状
import numpy as np
a = np.arange(12)
print ('原始数组:')
print (a)
b = a.reshape(3,4)
print ('修改后的数组:')
print (b)
翻转数组
# 翻转数组
import numpy as np
a = np.arange(20).reshape(5,4)
print ('原数组:')
print (a )
print ('对换数组:')
print (np.transpose(a))
方法二:ndarray.T
# 方法二:ndarray.T
import numpy as np
a = np.arange(16).reshape(4,4)
print('原数组:')
print(a)
print('转置数组:')
print(a.T)
修改数组维度
# 修改数组维度
import numpy as np
A = np.arange(9).reshape(3, 3)
print(A)
对数组进行广播运算
# 对数组进行广播运算
import numpy as np
A = np.arange(9).reshape(3, 3)
print(A)
B = np.arange(3)
print(A+B)
# broadcast_to 函数用法,注意不能改变原来数列的形状
import numpy as np
d = np.arange(4).reshape(1,4)
print (d)
[[0 1 2 3]]
print (np.broadcast_to(d,(3,4)))
[[0 1 2 3]
[0 1 2 3]
[0 1 2 3]]
连接数组
- concatenate():链接沿现有轴的数组序列
# concatenate():链接沿现有轴的数组序列
import numpy as np
a = np.array([[1,2],[3,4]])
print ('第一个数组:')
print (a)
b = np.array([[5,6],[7,8]])
print ('第二个数组:')
print (b)
print ('沿轴0连接两个数组:')
print (np.concatenate((a,b)))
print ('沿轴1连接两个数组:')
print (np.concatenate((a,b),axis = 1))
- stack():堆叠两个数组
# stack():堆叠两个数组
import numpy as np
a = np.array([[1,2],[3,4]])
print ('第一个数组:')
print (a)
b = np.array([[5,6],[7,8]])
print ('第二个数组:')
print (b)
print ('沿轴 0 堆叠两个数组:')
print (np.stack((a,b),0))
print ('沿轴 1 堆叠两个数组:')
print (np.stack((a,b),1))
- hstack():水平堆叠
# hstack():水平堆叠:
import numpy as np
a = np.array([[1,2],[3,4]])
print ('第一个数组:')
print (a)
b = np.array([[5,6],[7,8]])
print ('第二个数组:')
print (b)
print ('水平堆叠:')
c = np.hstack((a,b))
print (c)
- 竖直堆叠
# 竖直堆叠
import numpy as np
a = np.array([[1,2],[3,4]])
print ('第一个数组:')
print (a)
b = np.array([[5,6],[7,8]])
print ('第二个数组:')
print (b)
print ('竖直堆叠:')
c = np.vstack((a,b))
print (c)
分割数组
import numpy as np
a = np.arange(12)
print ('第一个数组:')
print (a)
print ('将数组分为三个大小相等的子数组:')
b = np.split(a,4)
print (b)
print ('将数组在一维数组中表明的位置分割:')
b = np.split(a,[4,7])
print (b)
- hsplit:竖直切割|
# hsplit:竖直切割|
import numpy as np
a = np.arange(12).reshape(4,3)
print ('数组a:')
print(a)
print ('拆分后的数组:')
print(np.hsplit(a, 3))
- vsplit:水平分割
import numpy as np
a = np.arange(12).reshape(4,3)
print ('数组a:')
print (a)
print ('水平分割:')
b = np.vsplit(a,2)#2表示分割的组数,但是要注意要被整除分组
print (b)
数组的添加和删除
# resize()
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print ('第一个数组a:')
print (a)
print ('第一个数组a的形状:')
print (a.shape)
b = np.resize(a, (3,2))
print ('第二个数组b:')
print (b)
print ('第二个数组b的形状:')
print (b.shape)
print ('修改第一个数组a的大小:')
c = np.resize(a,(3,3))
print (c)
- 添加
# 添加
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print ('数组a:')
print (a)
print ('向数组a添加元素:')
print (np.append(a, [7,8,9]))
print ('沿轴0添加元素:')
print (np.append(a, [[7,8,9]],axis = 0))
print ('沿轴1添加元素:')
print (np.append(a, [[5,5,5],[7,8,9]],axis = 1))
- 插入
# 插入
import numpy as np
a = np.array([[1,2],[3,4],[5,6]])
print ('数组a:')
print (a)
print ('未传递 Axis 参数,在插入之前输入数组a会被展开')
print (np.insert(a,3,[11,12]))
print ('传递了Axis 参数,会广播数值生成新的数组')
print ('沿轴0广播:')
print (np.insert(a,1,[11],axis = 0))
print ('沿轴1广播:')
print (np.insert(a,1,11,axis = 1))
- 删除
# 删除
import numpy as np
a = np.arange(15).reshape(3,5)
print ('数组a:')
print (a)
print ('未传递 Axis 参数,在插入之前输入数组会被展开。')
print (np.delete(a,8))
print ('删除第二列:')
print (np.delete(a,1,axis = 1))
- 去重
# 去重
import numpy as np
a = np.array([1,2,3,3,2,4,5,4,8,7,2,2,5,9,6])
print ('数组a:')
print (a)
print ('数组a的去重值:')
b = np.unique(a)
print (b)
print ('去重数组a的索引数组:')
b,indices = np.unique(a,return_index = True)
print (indices)
print ('返回去重元素的重复数量:')
c,indices = np.unique(a,return_counts = True)
print (c)
print (indices)
数组排序
- sort()
import numpy as np
a = np.array([5,21,2,28,6])
print(a)
a.sort()
print(a)
- 0表示按行排列大小,1是按列排序
# 0表示按行排列大小,1是按列排序
b = np.array([5,21,2,28,7,6]).reshape(2,3)
print ('数组b是:')
print (b)
print ('调用 sort() 函数排序后的数组b:')
print (np.sort(b))
print ('按列排序后的数组b:')
print (np.sort(b, axis = 0))
- argsort()返回排序后索引,原数据没变
# argsort()返回排序后索引,原数据没变
c=np.array([2,1,5,8,-5,4])
c.argsort()
# 二维排序索引,元数据没变
d=np.array([[1,5,3], [6, 2,8], [3, 6, 0]])
print ('数组d是:')
print (d)
print ('调用 argsort() 函数排序后的数组d:')
print (np.argsort(d))
print ('按列排序后的数组d:')
print (np.argsort(d, axis = 0))
- lexsort 优先照顾后列排序原则
# 小升初考试,重点班录取学生按照总成绩录取。在总成绩相同时,
# 数学成绩高的优先录取,在总成绩和数学成绩都相同时,
# 按照英语成绩录取…… 这里,总成绩排在电子表格的最后一列,
# 数学成绩在倒数第二列,英语成绩在倒数第三列
import numpy as np
names = np.array(['Tom','Abe','Lily','Jane','Judy'])
ages = np.array([14, 13, 15, 12, 11])
total_scores = np.array([5., 6., 8., 18., 16.])
maths_scores=np.array([8,7,4,9,6])
index_lexsorted = np.lexsort((maths_scores, total_scores))
print(index_lexsorted)
names_lexsorted = names[np.lexsort((maths_scores, total_scores))]
print(names_lexsorted)
函数
字符串函数
# 字符串函数
import numpy as np
print ('连接示例1:')
print (np.char.add(['Hello'],[' Numpy']))
print ('连接示例2:')
print (np.char.add(['Hello', 'Hi'],[' Numpy', ' Pandas']))
- 首字母大写
# 首字母大写
import numpy as np
print(np.char.capitalize('python'))
- 每个元素大写
# 每个元素大写
import numpy as np
print (np.char.upper(['numpy','pandas']))
print (np.char.upper('scipy'))
数学函数用法
# 数字函数用法
import numpy as np
a = np.arange(5)
b=np.sqrt(a)
c=np.exp(a)
d=np.square(a)#%%
print('数组a:')
print(a)
print('数组a的开方:')
print(b)#%%
print('数组a的指数函数:')
print(c)
print('数组a的开方:')
- 三角函数
import numpy as np
a = np.array([0,30,45,60,90,180])
b=np.sin(a*np.pi/180)
c=np.cos(a*np.pi/180)
d=np.tan(a*np.pi/180)
print ('数组a:')
print (a)
print ('数组中角度的正弦值:')
print (b)
print ('数组中角度的余弦值:')
print (c)
print ('数组中角度的正切值:')
print (d)
算数函数
import numpy as np
a = np.arange(25, dtype = np.float_).reshape(5,5)
b = np.array([1,2,3,4,5])
c=np.add(a,b)
d=np.subtract(a,b)
e=np.multiply(a,b)
f=np.divide(a,b)
- 统计函数
# 统计函数
import numpy as np
a = np.array([[1,4,7,3],[5,6,14,33],[12,4,21,9]])
print ('数组a:')
print (a)
print ('调用 amin() 函数计算最小值:')
print (np.amin(a,1))
print ('再次调用 amin() 函数计算最小值:')
print (np.amin(a,0))
print ('调用 amax() 函数计算最大值:')
print (np.amax(a))
print ('再次调用 amax() 函数计算最大值:')
print (np.amax(a, axis = 0))
import numpy as np
a = np.array([[1,4,7,3],[5,6,14,33],[12,4,21,9]])
print ('数组a:')
print (a)
print ('调用 ptp() 函数计算的极差:')
print (np.ptp(a))
print ('沿轴 1 调用 ptp() 函数计算的极差:')
print (np.ptp(a, axis = 1))
print ('沿轴 0 调用 ptp() 函数计算的极差:')
print (np.ptp(a, axis = 0))
import numpy as np
a = np.array([[1,4,7,3],[5,6,14,33],[12,4,21,9]])
print ('数组a是:')
print (a)
print ('调用 percentile() 函数:')
print (np.percentile(a, 10)) # axis 为 0,在纵列上求
print (np.percentile(a, 50, axis=0)) # axis 为 1,在横行上求
print (np.percentile(a, 50, axis=1)) # 保持维度不变
print (np.percentile(a, 50, axis=1, keepdims=True))
矩阵
空矩阵
import numpy.matlib
import numpy as np
a=np.matlib.empty((3,3))
print(a)#数字是随机的
0矩阵
# 0矩阵
import numpy.matlib
import numpy as np
print (np.matlib.zeros((3,4)))
全1矩阵
# 全1矩阵
import numpy.matlib
import numpy as np
print (np.matlib.ones((3,4)))
单位矩阵,对角线为1
# 单位矩阵,对角线为1.
import numpy.matlib
import numpy as np
print (np.matlib.identity(4))
对角阵
# 对角阵
import numpy as np
# K是对角线的索引,n为行数,M为列
print(np.matlib.eye(n=3,M=5,k=0,dtype=float))
随机矩阵
# 随机矩阵
import numpy.matlib
import numpy as np
print (np.matlib.rand(4,4))