目录
前言:
创建数组对象
数组属性:ndarray(数组)是存储单一数据类型的多维数组。
数组创建:
创建数组并查看数组属性:
重新设置数组的shape属性
使用arange函数创建数组
使用linespace函数创建数组
使用logspace函数创建等比数列
使用zeros函数创建数组
使用eye函数创建数组
使用diag函数创建数组
使用ones函数创建数组
数组数据类型
数组数据类型转换
创建数据类型
查看数据类型,可以直接查看或者使用nmpy.dtype函数查看
在使用array函数创建数组时,数组的数据类型默认是浮点型。自定义数组数据,则可以预先指定数据类型
生成随机数
无约束条件下生成随机数
生成服从均匀分布的随机数
生成服从正态分布的随机数
生成给定上下范围的随机数,如创建一个最小值不低于2、最大值不高于10的2行5列数组
random模块常用随机数生成函数
通过索引访问数组
一维数组的索引
多维数组的索引
多维数组的索引(使用整数和布尔值索引访问数据)
变换数组的形态
改变数组形状
使用ravel函数展平数组
使用flatten函数展平数组
组合数组
切割数组
创建Numpy矩阵
矩阵的运算
矩阵的属性
ufunc函数
一维数组的广播机制
编辑
二维数组的广播机制
问题:
代码演示:
扩展库numpy是Python支持科学计算的一个很重要的库,常用语数据分析和科学计算领域,如sklearn、pandas、scipy等,numpy提供了强大的数组运算能力以及复杂的广播机制。本篇内容将介绍数组与矩阵及其相关运算。
基于Numpy的数据分析计算生态系统有:
NumPy SciPy Pandas Matplotlib Sckit-image statsmodels scikit-learn
Cython PyTables Numba SymPy NumExpr OpenCV astropy PySAL
BioPython GDAL......
功能介绍:
属性 | 说明 |
---|---|
ndim | 返回int。表示数组的维数 |
shape | 返回tuple。表示数组的尺寸,对于n行n列的矩阵,形状为(n,m) |
size | 返回int。表示数组的元素总数,等于数组形状的乘机 |
dtype | 返回data-type。描述数组中元素的类型 |
itemsize | 返回int。表示数组的每个元素的大小(以字节为单位) |
numpy.array(object, dtype=None, copy=True, order='K',subok=False, ndmin=0)
参数名称 | 说明 |
---|---|
object | 接收array。表示想要创建的数组。无默认 |
dtype | 接收data-array。表示数组所需的数据类型。如果未给定,则选择保存对象所需的最小类型。默认为None。 |
ndmin | 接收int。指定生成数组应该具有的最小维数。默认为None。 |
import numpy as np
#例8.1:创建数组查看属性
import numpy as np #导入NumPy库
arr1 = np.array([1, 2, 3, 4]) #创建一维数组
print('创建的数组为:', arr1)
arr2 = np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]]) #创建二维数组
print('创建的数组为:\n', arr2)
#查看数组结构
print('数组维度为:', arr2.shape)
# 查看数组类型
print('数组类型为:', arr2.dtype)
#查看数组元素个数
print('数组元素个数为:', arr2.size)
#查看数组每个元素大小
print('数组每个元素大小为:', arr2.itemsize)
arr2.shape = 4,3 #重新设置 shape
print('重新设置 shape 后的 arr2 为:',arr2)
创建的数组为:
[[ 1 2 3 4]
[ 4 5 6 7]
[ 7 8 9 10]]
数组维度为:(3,4)
重新设置shape维度后的arr2为:
[[ 1 2 3]
[ 4 4 5]
[ 6 7 7]
[ 8 9 10]]
print(‘使用arange函数创建的数组为:\n’,np.arange(0,1,0.1))
print(‘使用linespace函数创建的数组为:\n’,np.linespace(0,1,12))
print(‘使用logspace函数创建的数组为:\n’,np.logspace(0,5,40))
print(‘使用zeros函数创建的数组为:\n’,np.zeros((2,3)))
print(‘使用eye函数创建的数组为:\n’,np.eye(5))
print(‘使用diag函数创建的数组为:\n’,np.diag([1,2,3,4]))
print(‘使用ones函数创建的数组为:\n’,np.ones((5,3)))
类型 | 描述 |
---|---|
bool | 用一位存储的布尔类型(值为TRUE或FALSE) |
inti | 由所在的平台决定其精度的整数(一般为int32或int64) |
int8 | 整数,范围为-128到127 |
int16 | 整数,范围为-32768到32767 |
int32 | 整数,范围为-2^31到2^32-1 |
...... | ...... |
#例8.2:数组数据类型转换
import numpy as np #导入NumPy库
print('转换结果为:', np.float64(42)) #整型转换为浮点型
print('转换结果为:', np.int8(42.0)) #浮点型转换为整型
print('转换结果为:', np.bool(42)) #整型转换为布尔型
print('转换结果为:', np.bool(0)) #整型转换为布尔型
print('转换结果为:', np.float(True)) #布尔型转换为浮点型
print('转换结果为:', np.float(False)) #布尔型转换为浮点型
do = np.dtype([("name", np.str_, 40), ("numitems", np.int64), ("price",np.float64)]) print('数据类型为:',df)
print('数据类型为:', df["name"]) print('数据类型为:', np.dtype(df["name"]))
itemz = np.array([("tomatoes", 42, 4.14), ("cabbages", 13, 1.72)], dtype=df) print('自定义数据为:',itemz)
print('生成的随即数组为:',np.random.random(100))
print('生成的随机数组为:\n',np.random.rand(10,5))
print('生成的随即数组为:\n',np.random.randn(10,5))
print('生成的随即数组为:',np.random.randint(2,10,size = [2,5]))
函数 | 说明 |
---|---|
seed | 确定随机数生成器的种子 |
permutation | 返回一个序列的随机排列或返回一个随机排列的范围 |
shuffle | 对一个序列进行随机排序 |
binomial | 产生二项分布的随机数 |
normal | 产生正态(高斯)分布的随机数 |
beta | 产生beta分布的随机数 |
chisquare | 产生卡方分布的随机数 |
gamma | 产生gamma分布的函数 |
uniform | 产生在[0,1]中均匀分布的函数 |
#例8.4:一维数组索引
import numpy as np #导入NumPy库
arr = np.arange(10)
print(arr)
print('索引结果为:', arr[5]) #用整数作为下标可以获取数组中的某个元素
print('索引结果为:', arr[3:5]) #用范围作为下标获取数组的一个切片,包括arr[3]不包括arr[5]
print('索引结果为:', arr[:5]) #省略开始下标,表示从arr[0]开始
print('索引结果为:', arr[-1]) #下标可以使用负数,-1表示从数组后往前数的第一个元素
arr[2:4] = 100, 101
print('索引结果为:', arr) #下标还可以用来修改元素的值
#范围中的第三个参数表示步长,2表示隔一个元素取一个元素
print('索引结果为:', arr[1:-1:2])
print('索引结果为:', arr[5:1:-2]) #步长为负数时,开始下标必须大于结束下标
#例8.5:二维数组索引
import numpy as np #导入NumPy库
arr = np.array([[1, 2, 3, 4, 5], [4, 5, 6, 7, 8], [7, 8, 9, 10, 11]])
print('创建的二维数组为:', arr)
print('索引结果为:', arr[0, 3:5]) #索引第0行中第3和4列的元素
#索引第2和3行中第3~5列的元素
print('索引结果为:', arr[1:, 2:])
print('索引结果为:', arr[:, 2]) #索引第2列的元素
#例8.6:二维数组索引2
import numpy as np #导入NumPy库
arr = np.array([[1, 2, 3, 4, 5], [4, 5, 6, 7, 8], [7, 8, 9, 10, 11]])
#从两个序列的对应位置取出两个整数来组成下标:arr[0,1], arr[1,2], arr[2,3]
print('索引结果为:', arr[[(0,1,2), (1,2,3)]])
print('索引结果为:', arr[1:, (0,2,3)]) #索引第2、3行中第0、2、3列的元素
mask = np.array([1,0,1], dtype=np.bool)
print(mask)
#mask是一个布尔数组,它索引第1、3行中第2列的元素
print('索引结果为:', arr[mask, 2])
#例8.7:变换数组形态
import numpy as np #导入NumPy库
arr = np.arange(12) #创建一维数组
print('创建的一维数组为:', arr)
print('新的一维数组为:', arr.reshape(3,4)) #设置数组的形状
print('数组维度为:', arr.reshape(3,4).ndim) #查看数组维度
print(arr)
#ravel函数数组展平工作
arr = np.arange(12).reshape(3, 4)
print('创建的二维数组为:\n', arr)
print('数组展平后为:', arr.ravel())
#flatten函数数组展平工作
print('数组展平为:', arr.flatten()) #横向展平
print('数组展平为:', arr.flatten('F')) #纵向展平
#例8.8:实现数组组合
import numpy as np
# hstack函数横向组合
arr1 = np.arange(12).reshape(3,4)
print('创建的数组1为:\n',arr1)
arr2 = arr1*3
print('创建的数组2为:\n',arr2)
print('横向组合为:\n',np.hstack((arr1,arr2))) #hstack函数横向组合
#使用vstack函数实现数组纵向组合
print('纵向组合为:\n',np.vstack((arr1,arr2))) #vstack函数纵向组合
# 使用concatenate函数实现数组组合
print('横向组合为:\n',np.concatenate((arr1,arr2),axis = 1)) #concatenate函数横向组合
print('纵向组合为:\n',np.concatenate((arr1,arr2),axis = 0)) #concatenate函数纵向组合
# 使用hsplit函数实现数组横向分割
arr = np.arange(16).reshape(4,4)
print('创建的二维数组为:\n',arr)
print('横向分割为:\n',np.hsplit(arr, 2)) #hsplit函数横向分割
# vsplit函数实现数组纵向分割
print('纵向分割为:\n',np.vsplit(arr, 2)) #vsplit函数纵向分割
# split函数分割数组
print('横向分割为:\n',np.split(arr, 2, axis=1)) #split函数横向分割
print('纵向分割为:\n',np.split(arr, 2, axis=0)) #split函数纵向分割
#例8.9:创建NumPy矩阵
import numpy as np #导入NumPy库
matr1 = np.mat("1 2 3;4 5 6;7 8 9") #使用分号隔开数据
print('创建的矩阵为:\n', matr1)
matr2 = np.matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print('创建的矩阵为:', matr2)
arr1 = np.eye(3)
print('创建的数组1为:\n', arr1)
arr2 = 3*arr1
print('创建的数组2为:\n', arr2)
print('创建的矩阵为:\n', np.bmat("arr1 arr2; arr1 arr2"))
print('创建的矩阵为:\n', np.bmat("arr1 arr2"))
print('创建的矩阵为:\n', np.bmat("arr1; arr2"))
#例8.10:矩阵运算
import numpy as np #导入NumPy库
matr1 = np.mat("1 2 3;4 5 6;7 8 9") #创建矩阵
print('创建的矩阵为:', matr1)
matr2 = matr1*3 #矩阵与数相乘
print('创建的矩阵为:', matr2)
print('矩阵相加结果为:', matr1+matr2) #矩阵相加
print('矩阵相减结果为:', matr1-matr2) #矩阵相减
print('矩阵相乘结果为:', matr1*matr2) #矩阵相乘
print('矩阵对应元素相乘结果为:', np.multiply(matr1, matr2))
属性 | 说明 |
---|---|
T | 返回自身的转置 |
H | 返回自身的共轭转置 |
I | 返回自身的逆矩阵 |
A | 返回自身数据的2维数组的一个视图 |
#例8.11:ufunc函数运算
import numpy as np #导入NumPy库
#四则运算
x = np.array([1,2,3])
y = np.array([4,5,6])
print('数组相加结果为:', x + y) #数组相加
print('数组相减结果为:', x - y) #数组相减
print('数组相乘结果为:', x * y) #数组相乘
print('数组相除结果为:', x / y) #数组相除
print('数组幂运算结果为:', x ** y) #数组幂运算
#比较运算
x = np.array([1,3,5])
y = np.array([2,3,4])
print('数组比较结果为:', x < y)
print('数组比较结果为:', x > y)
print('数组比较结果为:', x == y)
print('数组比较结果为:', x >= y)
print('数组比较结果为:', x <= y)
print('数组比较结果为:', x != y)
#逻辑运算
print('数组逻辑运算结果为:', np.all(x == y)) #np.all()表示逻辑and
print('数组逻辑运算结果为:', np.any(x == y)) #np.any()表示逻辑or
#例8.12:一维数组的广播机制
import numpy as np #导入NumPy库
arr1 = np.array([[0,0,0],[1,1,1],[2,2,2],[3,3,3]])
print('创建的数组1为:',arr1)
print('数组1的shape为:',arr1.shape)
arr2 = np.array([1,2,3])
print('创建的数组2为:',arr2)
print('数组2的shape为:',arr2.shape)
print('数组相加结果为:',arr1 + arr2)
#例8.13:二维数组的广播机制
import numpy as np #导入NumPy库
arr1 = np.array([[0,0,0],[1,1,1],[2,2,2],[3,3,3]])
print('创建的数组1为:',arr1)
print('数组1的shape为:',arr1.shape)
arr2 = np.array([1,2,3,4]).reshape((4,1))
print('创建的数组2为:',arr2)
print('数组2的shape为:',arr2.shape)
print('数组相加结果为:',arr1 + arr2)
import numpy as np #导入NumPy
n = 100
dist = np.zeros([n, n])
point = np.random.rand(n,2)
for i in range(n):
for j in range(n):
dist[i, j] = np.sqrt(sum((point[i, :] - point[j, :])**2))
print(dist)
以上便是我对numpy数组和矩阵运算的总结,感谢观看,码字不易,如果对你有帮助,点个赞就是给我最大的动力。