文章说明: 本系列面向全国大中小学的通用数据科学教材,原项目是由
Jin Li大佬整理的python笔记,鄙人学习后添加了许多自己的见解,于是最后写成了这系列手册。
文章目录
生成数组
1. 使用arange
函数
arange函数类似range函数,其返回值为数组。
语法:
# arange(start, stop=None, step=1, dtype=None)
import numpy as np
np.arange(4)
# 返回 array([0,1,2,3])
同时可以为arange
函数生成的数组设置步长:
# 设置步长为0.1
np.arange(0,1,0.1, dtype=np.float)
2. 使用linspace
函数
linspace函数可以生成一个等差数组,其参数列表为起始值、终止值以及数组元素的个数。
# 与arange函数不同的是
# linspace第三个参数设置的是元素个数,而不是步长
np.linspace(0,5,5)
# 返回 array([0,1,2,3,4])
与linspace
相应的还有一个logspace
函数。该函数可以对产生数等距分布的数组,其默认以10为基地,用法与linspace
类似。
3. 生成网格数组
使用meshgrid
函数
meshgrid
函数可以在给定一维坐标阵列x1,x2,…,xn的情况下,为N-D网格上的N-D标量/矢量场的矢量化生成N-D坐标数组。
语法:numpy.meshgrid(*xi, **kwargs)
meshgrid
函数通过索引关键字参数支持这两种索引约定。给字符串ij返回一个带有矩阵索引的网格网格,而xy返回带有笛卡尔索引的网格网格。在输入长度为M和N的二维情况下,xy
索引的输出为形状(N, M)
, ij
索引的输出为形状(M, N)
。在输入长度为M、N和P的三维情况下,xy
索引的输出为形状(N, M, P)
, ij
索引的输出为形状(M, N, P)
。
# 官网给出的例子
xv, yv = np.meshgrid(x, y, sparse=False, indexing='ij')
for i in range(nx):
for j in range(ny):
# 使用ij方式索引返回<i,j>型数组
# treat xv[i,j], yv[i,j]
xv, yv = np.meshgrid(x, y, sparse=False, indexing='xy')
for i in range(nx):
for j in range(ny):
# 使用xy型索引,返回<j,i>型数组
# treat xv[j,i], yv[j,i]
实例:生成一个3-2维网格数组
nx, ny = (3,2)
# 生成一个包含三个元素的一维数组
x = np.linspace(0,1, nx)
# 生成一个包含两个元素的一维数组
y = np.linspace(0,1, ny)
xv, yv = np.meshgrid(x,y)
# 返回的xv、yv的维数分别为(3,2) 和 (2,3)
# 其中xv 对应网格的第一维,yv 对应网格的第二维
# 如果希望生成稀疏数组,则可以添加sparse=True参数
xv, yv = np.meshgrid(x, y, sparse=True)
补充:稀疏矩阵
由于数组中大部分的内容值都未被使用或者都为零,亦或数组中元素大量规律重复,使得数组中仅有少部分的空间使用,而造成内存空间的浪费。
为了节省内存空间,并且不影响数组中原有的内容值,此时就可以使用稀疏数组来存储。
使用ogrid
, mgrid
函数
在Matlab中有 meshgrid 的用法:
meshgrid(-1:.5:1, -1:.5:1)
。 然而Numpy的 meshgrid 并不支持这样的用法,但我们可以使用ogrid / mgrid
来实现类似这样的用法。
-
ogrid
相当于meshgrid(indexing='ij', sparse=True)
-
mgrid
相当于meshgrid(indexing='ij', sparse=False)
>>>x, y = np.ogrid[-1:1:.5, -1:1:.5]
>>>x
array([[-1. ],
[-0.5],
[ 0. ],
[ 0.5]])
>>>y
array([[-1. , -0.5, 0. , 0.5]])
注意:
- 这里使用中括号来生成元素
- 在Matlab使用的是
start:step:end
的表示,Numpy 使用的是start:end:step
的表示 - 这里的结果不包括
end
的值
为了包含 end
的值,我们可以使用这样的技巧:
>>>x, y = np.ogrid[-1:1:5j, -1:1:5j]
>>>x, y
(array([[-1. ],
[-0.5],
[ 0. ],
[ 0.5],
[ 1. ]]), array([[-1. , -0.5, 0. , 0.5, 1. ]]))
在
step
的位置传入一个复数5j
,表示我们需要一个 5 个值的数组,此时返回值就会包含end
的值。
4. 使用r_
,c_
生成行列向量
1. 切片生成行向量
np.r_[0:1:.1]
# array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
可以使用复数步长指定数组长度:
np.r_[0:1:5j]
# array([ 0. , 0.25, 0.5 , 0.75, 1. ])
也可以连接多个序列生成数组:
np.r_[(1,2,3),4.0,[5,6]]
# array([1. , 2., 3., 4., 5., 6.])
2. 使用c_
生成列向量
np.c_[1:3:5j]
"""
array([[ 1. ],
[ 1.5],
[ 2. ],
[ 2.5],
[ 3. ]])
"""
5. 生成特殊数组
零矩阵
# 生成一个三维零向量
np.zeros(3)
元素全为一的矩阵
np.ones(shape, dtype=float64)
还可以使用ones
方法生成任意同一元素值的数组:
# 生成元素全为5的数组
np.ones([2,2])*5
"""
array([[ 5., 5.],
[ 5., 5.]]
"""
生成随机数组
使用empty
方法可以生成一个指定大小的数组:
a = np.empty(2)
# array([-0.03412165, 0.05516321])
由于创建
empty
数组时,数组所指向的内存未被初始化,所以值随机。
使用fill
方法,为empty
数组进行赋值:
a.fill(1)
a
# array([1,1])
产生一个相似的数组
使用empty_like
, ones_like
, zeros_like
方法产生对应的与a
相似的矩阵
empty_like(a)
ones_like(a)
zeros_like(a)
产生的矩阵与 a 大小一样,类型一样。
生成单位数组矩阵
使用identity
方法产生一个单位矩阵。
np.identity(3)
"""
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
"""
生成矩阵
使用mat
方法将多维数组转换为矩阵:
import numpy as np
a = np.array([1,2],[3,4])
A = np.mat(a)
A
"""
matrix([1,2],
[3,4])
"""
另一种方法生成矩阵:使用matlab语法,传入一个字符串生成矩阵:
A = np.mat('1,2,3;4,5,6;7,8,9')
A
"""
matrix([1,2,3],
[4,5,6],
[7,8,9])
"""
使用matlab还可以生成分块矩阵。
若需要连乘矩阵,可以使用幂方**
来表示:
# A矩阵的三次幂
A ** 3
逆矩阵:使用A.I
表示A矩阵的逆矩阵
未完待续~~
来源:CSDN
作者:Fracxx
链接:https://blog.csdn.net/JEsoloH/article/details/84898952