本文内容源自《利用Python进行数据分析》一书,更多内容见:
Numpy可视化博客
https://jalammar.github.io/visual-numpy
NumPy最重要的一个特点就是其N维数组对象(即ndarray)
,它是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的.每个数组都有一个shape
(一个表示各维度大小的元组)和一个dtype
(一个用于说明数组数据类型的对象)
首先用np.array()
创建ndarray
>>> import numpy as np
>>> data = [[1,2,3,4],[5,6,7,8]];
>>> arr = np.array(data);
>>> arr
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
然后输出shape
和dtype
,注意arr.shape()
是错误的.
>>> arr.shape
(2, 4)
>>> arr.dtype
dtype('int32')
创建数组最简单的办法就是使用np.array()
函数,它接收一切序列型的对象(创建其它数组),然后产生一个新的含有传入数据的NumPy数组.
示例1
>>> data = [1,2,3,4]
>>> arr = np.array(data)
>>> arr
array([1, 2, 3, 4])
示例2
如上面展示的嵌套序列(由一组等长列表组成的列表)
>>> data = [[1,2,3,4],[5,6,7,8]];
>>> arr = np.array(data);
>>> arr
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
示例3
zeros
创建指定长度或形状全为0数组
ones
创建指定长度或形状全为1的数组
>>> np.zeros(10)
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
>>> np.zeros((3,6))
array([[ 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0.]])
>>> np.ones((2,3,2))
array([[[ 1., 1.],
[ 1., 1.],
[ 1., 1.]],
[[ 1., 1.],
[ 1., 1.],
[ 1., 1.]]])
示例4
arange
创建等差数组,是Python内置函数range的数组版:
>>> np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
reshape
可以重新定义其形状
>>> mat = np.arange(12).reshape((3,4))
>>> mat
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
示例5
数组排序 np.sort(arr,axis=0)
或者arr.sort(axis=0)
(后者测试有问题) : 逐行由大到小排序,np.argsort(arr,axis)
返回排序的索引.
>>> arr
array([[14, 13, 12, 11],
[10, 9, 8, 7],
[ 6, 5, 4, 3]])
>>> np.sort(c,axis=0)
array([[ 6, 5, 4, 3],
[10, 9, 8, 7],
[14, 13, 12, 11]])
>>> np.sort(c,axis=1)
array([[11, 12, 13, 14],
[ 7, 8, 9, 10],
[ 3, 4, 5, 6]])
>>> np.argsort(a)
array([[3, 2, 1, 0],
[3, 2, 1, 0],
[3, 2, 1, 0]], dtype=int64)
dtype
是一个特殊的对象,它含有ndarray将一块内存解释为特定数据类型所需信息,创建ndarray时可以指定数据类型
>>> arr = np.array([1,2,4],dtype=np.int32)
>>> arr.dtype
dtype('int32')
>>> arr
array([1, 2, 4])
1.可以通过ndarray的 astype()
方法显式地转换为其dtype
>>> arr = np.array([1,2,3,4,5])
>>> arr.dtype
dtype('int32')
>>> float_arr = arr.astype(np.float64)
>>> float_arr
array([ 1., 2., 3., 4., 5.])
>>> float_arr.dtype
dtype('float64')
2.如果将浮点数转换成整数,则小数部分将会被截断
>>> arr = np.array([3.7,2.5,2.6])
>>> arr
array([ 3.7, 2.5, 2.6])
>>> arr.astype(np.int32)
array([3, 2, 2])
数组与标量的算术运算也会将那个标量值传播到各个元素
数乘
>>> arr
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> arr*2
array([[ 0, 2, 4, 6],
[ 8, 10, 12, 14],
[16, 18, 20, 22]])
相减
>>> arr1 - arr
array([[12, 12, 12, 12],
[12, 12, 12, 12],
[12, 12, 12, 12]])
相乘
>>> arr
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> arr1
array([[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]])
>>> arr * arr1
array([[ 0, 13, 28, 45],
[ 64, 85, 108, 133],
[160, 189, 220, 253]])
元素乘法:np.multiply(a,b)
矩阵乘法:np.dot(a,b) 或 np.matmul(a,b) 或 a.dot(b)
(元素乘法(哈达玛(Hadamard)) 就是对应位置元素相乘,不是线性代数中常用的加和那种!)
唯独注意:*
在 np.array 中重载为元素乘法(即对应元素相乘不加和),在 np.matrix 中重载为矩阵乘法!
A = np.array([[1, 2],
[3, 4]])
B = np.array([[5, 6],
[7, 8]])
>>> A * B
array([[ 5, 12],
[21, 32]])
>>> np.dot(A, B) # 和下面结果相等
array([[19, 22],
[43, 50]])
>>> np.mat(A) * np.mat(B)
matrix([[19, 22],
[43, 50]])
计算矩阵n次幂
def func(num):
a = np.array([[1,0,2],[0,-1,1],[0,1,0]])
I = np.eye(3)
n = 1
for n in range(int(num)):
I = np.dot(I,a)
n = n+1
return I
例题 最小多项式
import numpy as np
a = np.array([[1,0,2],[0,-1,1],[0,1,0]])
I = np.eye(3)
print(np.dot(np.dot(a,a),a))
test_a = a-I
test_b = np.dot(a,a)+a-I
def func(num):
a = np.array([[1,0,2],[0,-1,1],[0,1,0]])
I = np.eye(3)
n = 1
for n in range(int(num)):
I = np.dot(I,a)
n = n + 1
return I
# 计算结果
print(2*func(8)-3*func(5)+func(4)+func(2)-4*I)
# 验证
print(24*func(2) -37*a +10*I)
矩阵求逆
>> np.linalg.inv(A)
array([[-2. , 1. ],
[ 1.5, -0.5]])
数学函数
>>> a = np.array([10,20,30,40,50])
>>> a
array([10, 20, 30, 40, 50])
三角函数
>>> a = np.array([10,20,30,40,50])
>>> a
array([10, 20, 30, 40, 50])
>>> np.sin(a)
array([-0.54402111, 0.91294525, -0.98803162, 0.74511316, -0.26237485])
以自然对数函数为底数的指数函数
>>> a = np.array([10,20,30,40,50])
>>> a
array([10, 20, 30, 40, 50])
>>> np.exp(a)
array([ 2.20264658e+04, 4.85165195e+08, 1.06864746e+13,
2.35385267e+17, 5.18470553e+21])
数组的方根的运算(开平方)
>>> b = np.array([4,9])
>>> np.sqrt(b)
array([ 2., 3.])
数组的方根的运算(立方): 注意是对每个元素进行计算
>>> a = np.array([[1,2],[3,4]])
>>> a
array([[1, 2],
[3, 4]])
>>> np.power(a,2)
array([[ 1, 4],
[ 9, 16]], dtype=int32)
>>> np.power(a,3)
array([[ 1, 8],
[27, 64]], dtype=int32)
统计数组各列的中位数 (以下均用a这个数组)
>>> a = np.array(([1, 4, 3], [6, 2, 9], [4, 7, 2]))
>>> a
array([[1, 4, 3],
[6, 2, 9],
[4, 7, 2]])
>>> np.median(a,axis=0)
array([ 4., 4., 3.])
统计数组各行的算术平均值
>>> np.mean(a,axis=1)
array([ 2.66666667, 5.66666667, 4.33333333])
统计数组各列的加权平均值
>>> np.average(a,axis=0)
array([ 3.66666667, 4.33333333, 4.66666667])
统计数组各行的方差
>>> np.var(a,axis=1)
array([ 1.55555556, 8.22222222, 4.22222222])
统计数组各列的标准偏差
>>> np.std(a,axis=0)
array([ 2.05480467, 2.05480467, 3.09120617])
使用数字 0 将一个全为 1 的 5x5 二维数组包围
>>> Z = np.ones((5,5))
>>> np.pad(Z, pad_width=1, mode='constant', constant_values=0)
array([[ 0., 0., 0., 0., 0., 0., 0.],
[ 0., 1., 1., 1., 1., 1., 0.],
[ 0., 1., 1., 1., 1., 1., 0.],
[ 0., 1., 1., 1., 1., 1., 0.],
[ 0., 1., 1., 1., 1., 1., 0.],
[ 0., 1., 1., 1., 1., 1., 0.],
[ 0., 0., 0., 0., 0., 0., 0.]])
创建一个 5x5 的二维数组,并设置值 1, 2, 3, 4 落在其对角线下方
>>> np.diag(1+np.arange(4),k=-1)
array([[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 2, 0, 0, 0],
[0, 0, 3, 0, 0],
[0, 0, 0, 4, 0]])
Python中双冒号的作用[::]
Python序列切片地址可以写为==[开始:结束:步长]==,其中的开始和结束可以省略.(可以用上面的的对角矩阵测试)
找出两个数组中相同的元素np.intersect1d(a,b)
>>> a = np.array(([1, 4, 3], [6, 2, 9], [4, 7, 2]))
>>> a
array([[1, 4, 3],
[6, 2, 9],
[4, 7, 2]])
>>> b= np.array([[12,3,4],[45,32,65],[48,8,34]])
>>> b
array([[12, 3, 4],
[45, 32, 65],
[48, 8, 34]])
>>> np.intersect1d(a,b)
array([3, 4])
将二维数组的前两行进行顺序交换
(注意A[[0,1]], A[[1,0]] 这种索引方法)
>>> A = np.arange(25).reshape(5,5)
>>> A
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
>>> A[[0,1]]
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
>>> A[[1,0]]
array([[5, 6, 7, 8, 9],
[0, 1, 2, 3, 4]])
>>> A[[0,1]] = A[[1,0]] # 完成交换
>>> A
array([[ 5, 6, 7, 8, 9],
[ 0, 1, 2, 3, 4],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
找出随机一维数组中出现频率最高的值(只能是一维数组)
Z = np.random.randint(0,10,50)
print("随机一维数组:", Z)
np.bincount(Z).argmax()
获得二维数组点积结果的对角线数组
>>> B = np.random.randint(0,6,(2,2))
>>> A = np.random.randint(0,6,(2,2))
>>> np.diag(np.dot(A,B)) # 方式一
array([8, 3])
>>> np.sum(A*B.T,axis=1) # 方式二:快
array([8, 3])
import numpy as np
np.set_printoptions(suppress=True,precision=4) # 默认是8, threshold=np.inf 完整输出(没有省略号)
# 使用五种不同的方法去提取一个随机数组的整数部分
Z = np.random.uniform(0,10,10)
print ("方法 1: ", Z - Z%1)
print ("方法 2: ", np.floor(Z))
print ("方法 3: ", np.ceil(Z)-1)
print ("方法 4: ", Z.astype(int))
print ("方法 5: ", np.trunc(Z))
numpy中的ravel()、flatten()、squeeze()的用法与区别
https://blog.csdn.net/weixin_38632246/article/details/99121202