数据科学初阶(四)-- numpy数组生成以及矩阵转换

淺唱寂寞╮ 提交于 2019-12-05 23:29:19

文章说明: 本系列面向全国大中小学的通用数据科学教材,原项目是由
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矩阵的逆矩阵


未完待续~~

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!