数组创建与操作
数组创建
import numpy as np
arr1=np.array((1,2,4,5,7,7))
arr2=np.array(((1,3,4),(2,45,56),(12,34,90)))
print('一维数组:\n',arr1)
print('二维数组:\n',arr2)
#result
一维数组:
[1 2 4 5 7 7]
二维数组:#主要有浮点型,所有的额=数据都会变成浮点型来保持数据的同质性
[[ 1. 3. 4. ]
[ 2.1 45. 56. ]
[12. 34. 90. ]]
数组元素的获取
通过索引
print(arr1[1])
print(arr1[[0,2]])#注意两个索引时候的形式
print(arr2[0:2])#左开右闭,打印第1、2行
print(arr2[1:2,0:2])打印第2行与第1、2列的交叉元素
#result
2
[1 4]
[[ 1. 3. 4. ]
[ 2.1 45. 56. ]]
[[ 2.1 45. ]]
通过函数#通过索引不能任意选取行和列
ix_函数
print(arr2[np.ix_([0,1],[0,1])])#打印第1、2行,第1、2列的交叉元素
#result
[[ 1. 3. ]
[ 2.1 45. ]]
数组的常用属性
可以通过numpy中的genfromtxt函数读取外部文本文件数据,文本文件主要为csv文件和txt文件。
np.genfromtxt(fname,dtype=<class 'float'>,comments='#',delimiter=None,skip_header=0,skip_footer=0,converters=None,missing_values=None,filling_values=None,usecols=None)
fname:指定需要读入的文件路径
dtype:指定读入的文件数据类型,默认为浮点型,如果数据集中含有字符型数据,必须指定为str
comments:指定注释符,默认为#,行首有#则忽略这些行的读入
delimiter:指定数据集的列分隔符
skip_header:是否跳过数据集的首行,默认不跳过
skip_footer:是否跳过数据集的脚注,默认不跳过
converters:将指定列的数据转换成其他数值
miss_values:指定缺失值的标记
filling_values:指定缺失值的填充值
usecols:指定需要读入哪些列
names:为读入数据的列设置列名称
```python
stu_score=np.genfromtxt(fname=r'C:\原U盘\交大\python可视化\第4章 Python数值计算工具--Numpy\stu_socre.txt',delimiter='\t',skip_header=1)
print(type(stu_score))#查看数据类型结构
print(stu_score.ndim)#查看数据维数
print(stu_score.shape)#查看数据行列数
print(stu_score.dtype)#查看数据类型
print(stu_score.size)#查看元素个数
数组的形状处理
reshape:reshape只是返回改变形状后的预览,但未改变数组的形状
resize:resize不会返回预览,而是会直接改变数组的形状
ravel、flatten、reshape可将多维数组降为一维数组,ravel与reshape返回的是视图,通过视图的修改会影响到原来数组,flatten返回的是复制,对复制进行修改,不影响原数组。
arr3=np.array([[1,3,4],[2,4,6],[3,6,8],[12,7,9],[2,4,5],[24,5,8]])
arr3=np.array([[1,3,4],[2,4,6],[3,6,8],[12,7,9],[2,4,5],[24,5,8]])
print('使用reshape改变形状后:\n',arr3.reshape(3,6))
print('重新打印arr3:\n',arr3)
print('使用resize改变形状后:\n',arr3.resize(3,6))
print('重新打印arr3:\n',arr3)
#result
使用reshape改变形状后:
[[ 1 3 4 2 4 6]
[ 3 6 8 12 7 9]
[ 2 4 5 24 5 8]]
重新打印arr3:
[[ 1 3 4]
[ 2 4 6]
[ 3 6 8]
[12 7 9]
[ 2 4 5]
[24 5 8]]
使用resize改变形状后:
None
重新打印arr3:
[[ 1 3 4 2 4 6]
[ 3 6 8 12 7 9]
[ 2 4 5 24 5 8]]
arr3=np.array([[1,3,4],[2,4,6],[3,6,8]])
print('使用ravel函数:\n',arr3.ravel(),arr3.ravel(order='F'))#默认情况下,优先按照数组的行顺序,逐个将元素降至一维,如果按照原始数组的列顺序,将数组降为一维的话,需要设置order参数为F
print('使用flatten函数:\n',arr3.flatten(),arr3.flatten(order='F'))
print('使用reshape函数:\n',arr3.reshape(-1),arr3.reshape(-1,order='F'))
使用ravel函数:
[1 3 4 2 4 6 3 6 8] [1 2 3 3 4 6 4 6 8]
使用flatten函数:
[1 3 4 2 4 6 3 6 8] [1 2 3 3 4 6 4 6 8]
使用reshape函数:
[1 3 4 2 4 6 3 6 8] [1 2 3 3 4 6 4 6 8]
vstack及row_stack:用于垂直方向(纵向)的数组堆叠
hstack及colum_stack:用于水平横向(横向)的数组堆叠
arr3=np.array([[1,3,4],[2,4,6],[3,6,8]])
arr4=np.array([1,4,89])
arr5=np.row_stack([arr3,arr4])
print(arr5)
arr6=np.array([[1],[3],[5]])#虽然arr3看起来像3×3的,但是仅仅是3个1×3的组合,所以要横着加进去还是要维度匹配,即横着是1维的
print(np.hstack([arr3,arr6]))
#result
垂直方向加:
[[ 1 3 4]
[ 2 4 6]
[ 3 6 8]
[ 1 4 89]]
水平方向加:
[[1 3 4 1]
[2 4 6 3]
[3 6 8 5]]
四则运算
+、-、*、/、%、//、***后面三个表示余数、整除、指数
import numpy as np
arr1=np.array([[1,2,3],[3,6,8],[4,6,9]])
arr2=np.array([[5,6,4],[2,5,9],[2,5,2]])
print(arr1+arr2)~np.add(arr1,arr2)
print(arr1-arr2)~np.subtract(arr1,arr2)
print(arr1*arr2)~np.multiply(arr1,arr2)
print(arr1/arr2)~np.divide(arr1,arr2)
print(arr1%arr2)~np.fomd(arr1,arr2)
print(arr1//arr2)~np.modf(arr1//arr2)
print(arr1**arr2)~np.power(arr1,arr2)
比较运算
>:np.greater(arr1,arr2)
≥:np.greater_equal(arr1,arr2)
<:np.less(arr1,arr2)
≤:np.less_equal(arr1,arr2)
==:np.equal(arr1,arr2)
!=:np.not_equal(arr1,arr2)
取子集
arr1=np.array([[1,2,3],[3,6,8],[4,6,9]])
arr2=np.array([[5,6,4],[2,5,9],[2,5,2]])
print('取出arr1中比arr2大的数:',arr1[arr1>arr2])
print('取出arr1中比4大的数:',arr1[arr1>4])
result
取出arr1中比arr2大的数: [3 6 4 6 9]
取出arr1中比4大的数: [6 8 6 9]
判断操作
arr1=np.array([[1,2,3],[3,6,8],[4,6,9]])
arr2=np.array([[5,6,4],[2,5,9],[2,5,2]])
print('把arr1中比4大的数改成4,否则不变:\n',np.where(arr1>4,4,arr1))
print('把arr1中比4大的数改成1,否则变成0:\n',np.where(arr1>4,1,0))
把arr1中比4大的数改成4,否则不变:
[[1 2 3]
[3 4 4]
[4 4 4]]
把arr1中比4大的数改成1,否则变成0:
[[0 0 0]
[0 1 1]
[0 1 1]]
常用的数学和统计函数
arr2=np.array([[5,6,4],[2,5,9],[2,5,2]])
print(arr2)
print(np.sum(arr2,axis=0))#axis=0表示按垂直方向计算
print(np.sum(arr2,axis=1))#axis=0表示按水平方向计算
线性代数相关运算
矩阵乘法
import numpy as np
arr1=np.array([[1,2,3],[2,21,12]])
arr2=np.array([[1,4,10,2],[2,45,89,67],[1,5,0,2]])
print(np.dot(arr1,arr2))
#result
[[ 8 109 188 142]
[ 56 1013 1889 1435]]
diag函数应用
arr1=np.arange(16).reshape(4,-1)
print('方阵是:\n',arr1)
print('取出方阵的对角线元素:\n',np.diag(arr1))
print('用下列数作对角线元素来构造方阵:\n',np.diag([1,2,3,4]))
#result
方阵是:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
取出方阵的对角线元素:
[ 0 5 10 15]
用下列数作对角线元素来构造方阵:
[[1 0 0 0]
[0 2 0 0]
[0 0 3 0]
[0 0 0 4]]
特征根与特征向量
arr2=np.array([[1,4,10],[2,45,89],[1,5,0]])
print('计算出下列矩阵的特征根和特征向量:\n',arr2)
print('arr2的特征根和特征向量是:\n',np.linalg.eig(arr2))
#result
计算出下列矩阵的特征根和特征向量:
[[ 1 4 10]
[ 2 45 89]
[ 1 5 0]]
arr2的特征根和特征向量是:
(array([53.64010158, 0.95247092, -8.59257249]), array([[-0.09319987, -0.98070401, -0.18141752],
[-0.99118784, 0.18307857, -0.84065162],
[-0.09412993, -0.06857023, 0.51028672]]))
多元一次方程的求解
求解:
3x+2y+z=39
2x+3y+z=34
x+2y+3z=26
A=np.array([[3,2,1],[2,3,1],[1,2,3]])
b=np.array([39,34,26])
print('AX=b的求解如下:\n',np.linalg.solve(A,b))
伪随机数的生成