python numpy常用操作_python学习笔记(一) NumPy常用操作

1. 介绍

​python本身含有列表和数组,但对于大数据来说,仍有不足,如不支持多维数组,也没有各种运算函数,不适合做数值运算。

​NumPy弥补了这些不足,它提供了两种基本的对象:

ndarray:存储单一数据类型的多维数组

ufunc: 能够对数组进行处理的汗水

2. 生成ndarray的几种方式

2.1 从已有数据中创建

示例一:

import numpy as np

list1 = [1, 2, 3, 4]

nd1 = np.array(list1)

print(nd1)

print(type(nd1))

上述代码将数组转换为ndarray对象,输出如下:

[1 2 3 4]

示例二:

import numpy as np

list1 = [[1, 2, 3, 4], [5, 6, 7, 8]]

nd1 = np.array(list1)

print(nd1)

print(type(nd1))

输出如下:

[[1 2 3 4]

[5 6 7 8]]

2.2 利用random模块生成ndarray

random模块用于生成随机数,该模块又分为多种函数:

random():生产0到1之间的随机数

uniform(): 生成均匀分布随机数

randn() : 生成标准正态分布随机数

normal() : 生成正态分布

shuffle() : 随机打乱顺序

seed() :设置随机数种子

...

示例一:

import numpy as np

list1 = np.random.random([3, 3])

nd1 = np.array(list1)

print(nd1)

一开始我还没明白为啥写两遍random,后来才看出来,第一个意思是调用random模块,第二个是执行该模块内部的random方法;另外参数[3,3]表示生成3行3列的矩阵。最终输出如下:

[[0.33454586 0.61149299 0.85523208]

[0.28477909 0.60613214 0.25216937]

[0.47037521 0.06700554 0.1916976 ]]

2.3 创建特定形状的多维数组

示例如下:

import numpy as np

# 生成全是0的3*3的矩阵

nd1 = np.zeros([3, 3])

# 生成全是1的3*3的矩阵

nd2 = np.ones([3, 3])

# 生成3阶的单位矩阵

nd3 = np.eye(3)

# 生成3阶的对角矩阵

nd4 = np.diag([1, 2, 3])

print(nd1)

print(nd2)

print(nd3)

print(nd4)

最终输出结果如下:

[[0. 0. 0.]

[0. 0. 0.]

[0. 0. 0.]]

[[1. 1. 1.]

[1. 1. 1.]

[1. 1. 1.]]

[[1. 0. 0.]

[0. 1. 0.]

[0. 0. 1.]]

[[1 0 0]

[0 2 0]

[0 0 3]]

2.4 利用arrange函数

arrange函数是numpy模块中的函数,其通过参数start, step,stop来设定范围和步长。其中start默认为0。示例如下:

import numpy as np

print(np.arange(10))

print(np.arange(0, 10))

print(np.arange(1, 4, 0.5))

print(np.arange(9, -1, -1))

输出如下:

[0 1 2 3 4 5 6 7 8 9]

[0 1 2 3 4 5 6 7 8 9]

[1. 1.5 2. 2.5 3. 3.5]

[9 8 7 6 5 4 3 2 1 0]

3. 存取元素

3.1 通过下标获取

示例一:

import numpy as np

# 生成10个随机数矩阵

nd1=np.random.random([10])

print(nd1)

#打印第3个元素

print(nd1[3])

# 打印第3到6个元素

print(nd1[3:6])

# 打印第1到6个元素,间隔2个元素打印一次

print(nd1[1:6:2])

# 逆序且间隔2个单位取一次元素

print(nd1[::-2])

最终输出结果如下:

[0.0941216 0.61965691 0.9426421 0.59370735 0.71552875

0.61783439 0.04356321 0.79254229 0.47524946 0.35386343]

0.5937073529078377

[0.59370735 0.71552875 0.61783439]

[0.61965691 0.59370735 0.61783439]

[0.35386343 0.79254229 0.61783439 0.59370735 0.61965691]

示例二:

import numpy as np

# 打印0到24的矩阵

nd2=np.arange(25).reshape([5,5])

print(nd2)

# 取1到3行,1到3列的子矩阵(3行3列不包括)

print(nd2[1:3,1:3])

# 取矩阵中打印3小于10的元素

print(nd2[(nd2>3)&(nd2<10)])

# 取0到1行的子矩阵

print(nd2[[0,1]])

# 取1到3列的子矩阵(不包括第3列)

print(nd2[:,1:3])

输出如下:

[[ 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]]

[[ 6 7]

[11 12]]

[4 5 6 7 8 9]

[[0 1 2 3 4]

[5 6 7 8 9]]

[[ 1 2]

[ 6 7]

[11 12]

[16 17]

[21 22]]

3.2 通过choice函数获取

除了使用上述方法获取元素外,还可以使用random.choice()函数随机抽取元素。示例如下:

import numpy as np

from numpy import random as nr

# 生成0到24的矩阵

a=np.arange(1,25)

# 随机取出构成3行4列的矩阵,元素可重复取出

c1=nr.choice(a,size=(3,4))

print(c1)

# 随机取出构成3行4列的矩阵,元素不可重复取出

c2=nr.choice(a,size=(3,4),replace=False)

print(c2)

# 随机抽取构成3行4列的矩阵,设置每个元素被取出的概率

c3=nr.choice(a,size=(3,4),p=a/np.sum(a))

print(c3)

最终结果如下:

# 默认情况下choice方法取数可重复,如下中的6就有两个

[[ 5 9 16 4]

[ 6 6 18 10]

[ 9 22 13 7]]

# 设置为不重复取数

[[18 2 7 22]

[ 4 20 21 17]

[15 24 1 5]]

# 设置每个元素被取出的概率,该示例中数值越大被取出的概率越大

[[13 23 15 18]

[ 6 21 15 6]

[19 22 20 19]]

4. 矩阵操作

NumPy中提供了一些矩阵运算的方法,示例如下:

import numpy as np

# 生成0到8的矩阵

nd1=np.arange(9).reshape([3,3])

print(nd1)

# 矩阵转置

nd2=np.transpose(nd1)

print(nd2)

# 矩阵乘法

a=np.arange(12).reshape([3,4])

b=np.arange(8).reshape([4,2])

c=a.dot(b)

print(c)

# 求矩阵的迹

print(a.trace())

# 计算矩阵的行列式

print(np.linalg.det(nd1))

打印如下:

[[0 1 2]

[3 4 5]

[6 7 8]]

[[0 3 6]

[1 4 7]

[2 5 8]]

[[ 28 34]

[ 76 98]

[124 162]]

15

0.0

5. 数据合并与展开

5.1 合并一维数组

import numpy as np

a=np.array([1,2,3])

b=np.array([4,5,6])

c=np.append(a,b)

print(c)

d=np.concatenate([a,b])

print(d)

上述使用append方法或者concatenate方法都可以将一维数组进行合并。输出结果如下:

[1 2 3 4 5 6]

[1 2 3 4 5 6]

5.2 多维数组的合并

import numpy as np

a=np.arange(4).reshape(2,2)

b=np.arange(4).reshape(2,2)

# 按行将两个矩阵合并

c=np.append(a,b,axis=0)

print(c)

print("c的维度为:",c.shape)

# 按列将两个矩阵合并

d=np.append(a,b,axis=1)

print(d)

print("d的维度为:",d.shape)

输出结果如下:

[[0 1]

[2 3]

[0 1]

[2 3]]

c的维度为: (4, 2)

[[0 1 0 1]

[2 3 2 3]]

d的维度为: (2, 4)

5.3 矩阵展平

示例代码如下:

import numpy as np

nd1=np.arange(6).reshape(2,-1)

print(nd1)

# 按列展开

nd2=nd1.ravel('F');

print(nd2)

# 按行展开

nd3=nd1.ravel()

print(nd3)

输出结果如下:

[[0 1 2]

[3 4 5]]

[0 3 1 4 2 5]

[0 1 2 3 4 5]

使用ravel方法展开成一行。

6. 通用函数

​前面一直介绍NumPy中的ndarray对象,下面再介绍ufunc对象,它是universal function的缩写。它可以对数组的每一个元素进行操作,避免了利用向量或矩阵时的循环语句。ufunc函数是一个统称,具有有sqrt,sin,cos,abs,dot等各种类型的运算函数。相比于math库的运算函数,ufunc函数速度更快,效率更高。

​如使用sin函数:

import numpy as np

nd1=np.arange(6).reshape(2,-1)

print(np.sin(nd1))

直接将矩阵作为参数传递,结果如下:

[[ 0. 0.84147098 0.90929743]

[ 0.14112001 -0.7568025 -0.95892427]]

7. 广播机制

下面是一个广播机制的示例:

import numpy as np

a=np.arange(10).reshape([5,2])

b=np.arange(2).reshape([1,2])

print(a+b)

示例中对一个5行2列的矩阵和一个1行2列的矩阵做加法。数学上两个矩阵的行列数要一致才可以做加减法,示例中是不对的,但是广播机制先对b进行复制扩充为5行2列的矩阵,第0列都为0,第1列都为1,这样两个5行2列的矩阵就可以做加法了,输出结果如下:

[[ 0 2]

[ 2 4]

[ 4 6]

[ 6 8]

[ 8 10]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值