numpy

本文详细介绍了NumPy库中数组的创建、操作、索引、切片、重塑、运算及随机模块的使用方法,包括常见函数如reshape、zeros、ones、linspace、arange、pad、concatenate、hstack、vstack、hsplit、vsplit、mean、sum等的用法,以及数组的复制区别和numpy.random模块的随机数生成。
摘要由CSDN通过智能技术生成

numpy.array()  中传入数组参数,可以是一维的也可以是二维三维的,numpy会将其转变成ndarray结构。

import numpy as np
a = np.array([1, 2, 3, 4])
# [1 2 3 4]
b = np.array([[1, 2, 3], [1, 2, 3]])    # 创建维度为2的数组
# [[1 2 3]
#  [1 2 3]]
print(type(a))  # <class 'numpy.ndarray'>

ndarray.shape()  查看数组的形状

print(a.shape)      # (4,)
print(b.shape)      # (2, 3)

ndarray.ndim  查看数组的维度

print(a.ndim)   # 1
print(b.ndim)   # 2

ndarray.size  查看元素的数量

print(b.size)   # 6

ndarray.reshape(row,column)  修改数组的形状

print(b.reshape(3, 2))
# [[1 2]
#  [3 1]
#  [2 3]]

ndarray.dtype    查看数组元素的类型

print(type(b))      # <class 'numpy.ndarray'>
print(b.dtype)      # int32

切片索引

一维切片索引

vector = numpy.array([5, 10, 15, 20])

print(vector[0:3])  # 切片索引取值# [ 5 10 15]

利用返回值获取元素

import numpy
vector = numpy.array([5, 10, 15, 20])
print(vector == 10)   # [False  True False False]
# 利用返回值获取元素
print(vector[vector == 10])# [10]

二维切片索引

多维的切片是按照各个维度分别取的

import numpy as np 

a = np.arange(25).reshape(5, 5)
print(a)
# [[ 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]]

# 取第1、2行,第2、3、4列
print(a[1:3, 2:5])        # 多维的切片是按照各个维度分别取
print(a[:, 2:5])          # 行取全部,列取第3-5

有时候将一个切片索引的参数改成None,那么ndarray的shape会变

print(a[:, None].shape)            # (5, 1, 5)

None代表新增加一个维度,它有一个别称叫做newaxis,因为在第二维上用了None,所以数组的shape变成了(5, 1, 5)

我们在第三个维度上看看,shape会变成什么样子。

print(a[:, :, None].shape)        # (5, 5, 1)

有时候数组的一个维度上是三个点,它是用省略号代替所有冒号a[:, :, None]和a[…, None]的输出是一样的,就是因为…代替了前面两个冒号

print(a[..., None].shape)        # (5, 5, 1)
print(a[:, :, None].shape)        # (5, 5, 1)

创建数组的常用函数

reshape:生成0-14的15个数字,使用reshape(3,5)将其构造成一个三行五列的array

arr = np.arange(15).reshape(3, 5)

# array([[0, 1, 2, 3, 4],
#        [5, 6, 7, 8, 9],
#        [10, 11, 12, 13, 14]]) 

squeeze函数:把shape中为1的维度去掉

arr = arr.reshape(1,1,-1)
print(arr)                # [[[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]]]

print(np.squeeze(arr))    # [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
print(np.squeeze(arr).shape)    # (15,)

zero:生成指定结构的默认为0.的array

a = np.zeros((3,4))

# [[0. 0. 0. 0.]
#  [0. 0. 0. 0.]
#  [0. 0. 0. 0.]]

ones:生成一个三维的array,通过dtype指定类型

a = np.ones((2, 3, 4), dtype=np.int32)  # 3行4列2层

# [[[1 1 1 1]
#   [1 1 1 1]
#   [1 1 1 1]]
# 
#  [[1 1 1 1]
#   [1 1 1 1]
#   [1 1 1 1]]]

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

在指定间隔[start, stop]之间返回均匀num个数字,如果endpoint是True,则不会取最后一个端点stop

np.linspace(2.0, 3.0, num=5)
# array([ 2.  ,  2.25,  2.5 ,  2.75,  3.  ])
np.linspace(2.0, 3.0, num=5, endpoint=False)
# array([ 2. ,  2.2,  2.4,  2.6,  2.8])

arange指定范围和数值间的间隔array,注意范围包左不包右

np.arange(0, 10, 2)

# [0, 2, 4, 6, 8, 10]

ndarray运算:矩阵之间的相加、相减、开根号、e平方

a = np.array([10,20,30,40])
b = np.array(4)
 
print(a - b)    # array([ 6, 16, 26, 36])
print(a**2) # array([ 100,  400,  900, 1600])
print(np.sqrt(B))   # array([[ 1.41421356,  0.        ],
                        # [ 1.73205081,  2.        ]])

print(np.exp(B))    # array([[  7.3890561 ,   1.        ],
                        # [ 20.08553692,  54.59815003]])

向下取整np.floor()和向下取整np.ceil()

import numpy as np
a = np.floor(10*np.random.random((2,2)))
print(a)
a = np.ceil(np.random.random((2,2)))
print(a)

# [[2. 8.]
#  [5. 0.]]
#######################
# [[1. 1.]
#  [1. 1.]]

a.T  转置(行列变换)

a = np.array([[1,2],[3,4]])
print(a.T)# 转置
# [[1 3]
#  [2 4]]

a.resize(1,4)  变换结构

a = np.array([[1,2],[3,4]])
a.resize(1,4)
prin(a)    # array([[1, 2, 3, 4]])

np.clip()

numpy.clip(a, a_min, a_max, out=None)

把数组a中小于a_min的值都化为a_min,大于a_max的值都化为a_max

import numpy as np

x=np.array([1,2,3,5,6,7,8,9])

print(np.clip(x,3,8))
# [3 3 3 5 6 7 8 8]

pad函数的用法

ndarray = numpy.pad(array, pad_width, mode, **kwargs)

参数:

  • array为要填补的数组
  • pad_width是在各维度的各个方向上想要填补的长度,如((1, 2),(1, 2)),表示:在二维数组array第一维(即行)前面填充1行,最后一行填充1行;在二维数组array第二维(即列)前面填充2列,最后面填充2列。
  • 如果直接输入一个整数,则说明各个维度和各个方向所填补的长度都一样。
  • mode为填补类型,即怎样去填补,有“constant”,“edge”等模式,如果为constant模式,就得指定填补的值,如果不指定,则默认填充0。

对于一维数组填充

import numpy as np
array = np.array([1, 1])

# (1,2)表示在一维数组array前面填充1位,最后面填充2位
#  constant_values=(0,2) 表示前面填充0,后面填充2
ndarray=np.pad(array,(1,2),'constant', constant_values=(0,2)) 

print(array)        # [1 1]
print(ndarray)        # [0 1 1 2 2]

对二维数组填充

import numpy as np
array = np.array([[1, 1],[2,2]])
"""
((1,1),(2,2))
在二维数组array第一维(此处便是行)前面填充1行,最后面填充1行;
在二维数组array第二维(此处便是列)前面填充2列,最后面填充2列
constant_values=(0,3) 表示第一维填充0,第二维填充3
"""
ndarray=np.pad(array,((1,1),(2,2)),'constant', constant_values=(0,3)) 

print(array)
# [[1 1]
#  [2 2]]

print(ndarray)
# [[0 0 0 0 3 3]
#  [0 0 1 1 3 3]
#  [0 0 2 2 3 3]
#  [0 0 3 3 3 3]]

矩阵运算

矩阵拼接:numpy.concatenate((a1, a2, ...), axis=0)

参数:

  a1、a2为待拼接的数组

  axis: 0 则拼接第一维度(行),1 则拼接第二维度(列)

import matplotlib.pyplot as plt
import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
print(np.concatenate((a, b), axis=0))        # 3行2列
# [[1 2]
#  [3 4]
#  [5 6]]
print(np.concatenate((a, b.T), axis=1))        # 2行3列
# [[1 2 5]
#  [3 4 6]]

concatenate([a, b])

a和b可以有一维size不同,但size不同的维度必须是要连接的维度

例如,a.shape为(4,5,6,10),b.shape为(4,5,6,20)

np.concatenate([a,b], axis=3) # 返回张量的shape为(4,5,6,30)

求和

matrix = numpy.array([[1,2,3],
                      [4,5,6],
                     [7,8,9]])
print(matrix.sum())# 45
print(matrix.sum(1))# 按每行求和 # [ 6 15 24]
print(matrix.sum(0))# 按每列求和 # [12 15 18]

sum(1) 是 sum(axis=1)) 的缩写,1表示按照 x轴方向求和,0表示按照y轴方向求和

矩阵乘法

A*B  A.dot(B)  np.dot(A,B)

import numpy as np
A = np.array([[1, 1], [0, 1]])
B = np.array([[2, 0], [3, 4]])
print(A*B)

print(A.dot(B))    # A*B
print(np.dot(A,B))  # A*B
# [[2 0]
#  [0 4]]

矩阵求均值  

numpy.mean(a, axis, dtype, out,keepdims )

mean()函数功能:求取均值 
经常操作的参数为axis,以m * n矩阵举例:

  • axis 不设置值,对 m*n 个数求均值,返回一个实数
  • axis = 0:压缩行,对各列求均值,返回 1* n 矩阵
  • axis =1 :压缩列,对各行求均值,返回 m *1 矩阵
a = np.array([[1, 2], [3, 4]])
print(a)
# array([[1, 2],
#        [3, 4]])
print(np.mean(a))   # 2.5
print(np.mean(a, axis=0))  # axis=0,计算每一列的均值
# array([ 2.,  3.])
print(np.mean(a, axis=1))  # 计算每一行的均值 
# array([ 1.5,  3.5])
View Code

np.hstack(a,b)  横向相加

 1 a = np.floor(10*np.random.random((2,2)))
 2 b = np.floor(10*np.random.random((2,2)))
 3  
 4 print(a)
 5 print(b)
 6 print(np.hstack((a,b)))
 7  
 8 # [[ 2.  3.]
 9 # [ 9.  3.]]
10 # [[ 8.  1.]
11 # [ 0.  0.]]
12 # [[ 2.  3.  8.  1.]
13 # [ 9.  3.  0.  0.]]
View Code

np.vstack(a,b)  纵向相加 

1 print(np.vstack((a,b)))
2  
3 # [[ 2.  3.]
4 # [ 9.  3.]
5 # [ 8.  1.]
6 # [ 0.  0.]]
View Code

np.hsplit(a,3)  矩阵纵向切割  把a竖切成3分

 1 a = np.floor(10*np.random.random((2,12)))
 2 print(a)
 3 print(np.hsplit(a,3))
 4 
 5 # [[1. 4. 9. 1. 7. 2. 6. 3. 5. 4. 1. 8.]
 6 #  [0. 0. 4. 4. 7. 9. 1. 6. 7. 3. 9. 2.]]
 7 
 8 
 9 #  [array([[1., 4., 9., 1.],
10 #        [0., 0., 4., 4.]]), 
11 #  array([[7., 2., 6., 3.],
12 #        [7., 9., 1., 6.]]), 
13 #  array([[5., 4., 1., 8.],
14 #        [7., 3., 9., 2.]])]
View Code

np.vsplit(a,3)  矩阵横向切割  把a横的切成3分

 1 b = np.floor(10*np.random.random((12,2)))
 2 print(b)
 3 print(np.vsplit(b,3))
 4 
 5 # [[8. 0.]
 6 #  [9. 1.]
 7 #  [9. 1.]
 8 #  [7. 7.]
 9 #  [7. 1.]
10 #  [9. 0.]
11 #  [8. 0.]
12 #  [7. 4.]
13 #  [8. 8.]
14 #  [7. 5.]
15 #  [9. 8.]
16 #  [1. 5.]]
17 
18 [array([[8., 0.],
19        [9., 1.],
20        [9., 1.],
21        [7., 7.]]), 
22 array([[7., 1.],
23        [9., 0.],
24        [8., 0.],
25        [7., 4.]]), 
26 array([[8., 8.],
27        [7., 5.],
28        [9., 8.],
29        [1., 5.]])]
View Code

复制的区别

地址复制:通过 b = a 复制 a 的值,b 与 a 指向同一地址,改变 b 同时也改变 a。

 1 a = np.arange(12)
 2 b = a
 3 print(a is b)
 4  
 5 print(a.shape)
 6 print(b.shape)
 7 b.shape = (3,4)
 8 print(a.shape)
 9 print(b.shape)
10  
11 # True
12 # (12,)
13 # (12,)
14 # (3, 4)
15 # (3, 4)
View Code

复制值:通过 a.view() 仅复制值,当对 c 值进行改变会改变 a 的对应的值,而改变 c 的 shape 不改变 a 的 shape,只有值会变,矩阵结构不变

 1 a = np.arange(12)# [ 0  1  2  3  4  5  6  7  8  9 10 11]
 2 c = a.view()
 3 print(c is a)
 4 
 5 c.shape = (2,6)
 6 c[0,0] = 9999
 7  
 8 print(a)
 9 print(c)
10  
11 # False
12 # [9999    1    2    3    4    5    6    7    8    9   10   11]
13 # [[9999    1    2    3    4    5]
14 # [   6    7    8    9   10   11]]
View Code

完全拷贝:a.copy() 进行的完整的拷贝,产生一份完全相同的独立的复制

 1 a = np.arange(12)
 2 c = a.copy()
 3 print(c is a)
 4  
 5 c.shape = 2,6
 6 c[0,0] = 9999
 7  
 8 print(a)
 9 print(c)
10  
11 # False
12 # [ 0  1  2  3  4  5  6  7  8  9 10 11]
13 # [[9999    1    2    3    4    5]
14 # [   6    7    8    9   10   11]]
View Code

numpy.random 随机模块

numpy的random模块用于生成随机数,

numpy.random.random(D0, d1,....dN)  

生成(0, 1]之间指定结构的随机数

np.random.random((2, 3))

# [[ 0.86166627,  0.37756207,  0.94265883],
#  [ 0.9768257 ,  0.96915312,  0.33495431]]

numpy.random.rand(D0d1...DN)

给定形状的数组,并在[0,1)之间

np.random.rand(3,2)
# array([[ 0.14022471,  0.96360618],  #random
#        [ 0.37601032,  0.25528411],  #random
#        [ 0.49313049,  0.94909878]]) #random

numpy.random.randn(D0d1...DN)

从“标准正态分布”返回一个或多个样本

a = np.random.randn(2, 4)
# [[-0.9115162  -1.32887292 -1.02910152  0.8023337 ]
#  [-1.14456771 -0.53251834 -1.75465906 -1.25668335]]

numpy.random.normal(loc = 0.0,scale = 1.0,size = None)

从正态分布中中抽取随机样本,其中均值为loc,方差为scale,size是形状

s = np.random.normal(0,1, 1000)
print(s.shape)  # (1000,)

numpy.random.randint(low, high=None, size=None, dtype='l')

生成[low,high)的随机整数,取数范围:若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。

a = np.random.randint(5, size=(2, 4))
# array([[4, 0, 2, 1],
#        [3, 2, 2, 0]])

b = np.random.randint(5,10,size=(2, 4))
# [[6 9 8 5]
#  [8 8 6 8]]

numpy.random.uniform(low=0.0, high=1.0, size=None)

功能:从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high.

参数: 

  • low: 采样下界,float类型,默认值为0;
  • high: 采样上界,float类型,默认值为1;
  • size: 输出样本数目,为int或元组(tuple)类型,例如,size=(m,n,k), 则输出m*n*k个样本,缺省时输出1个值。

numpy.random.choice(a, size=None, replace=True, p=None)

从序列中获取元素,若a为整数,元素取值为np.range(a)中随机数;若a为数组,取值为a数组元素中随机元素。

numpy.random.shuffle(x)

对X进行重排序,如果X为多维数组,只沿第一条轴洗牌(横轴),输出为None。

arr = np.arange(9).reshape((3, 3))
# [[0 1 2]
#  [3 4 5]
#  [6 7 8]]
np.random.shuffle(arr)
# [[3 4 5]
#  [0 1 2]
#  [6 7 8]]

numpy.random.seed(seed=None)    # 种下随机种子,使得生成的随机数相同

读取文件

numpy.gerfromtxt()用于读取文件,其中传入的参数依次是:

  1、需要读取txt文件位置,此处文件与程序位于同一目录下

  2、delimiter 分割的标记

  3、dtype 转换类型,如果文件中既有文本类型也有数字类型,就先转成文本类型

import numpy
 
world_alcohol = numpy.genfromtxt("world_alcohol.txt", delimiter=",",dtype=str)
print(type(world_alcohol))
print(world_alcohol)
print(help(numpy.genfromtxt))

help(numpy.genformtxt)用于查看帮助文档

参考文献

参考博客

NumPy官方文档

CSDN博客Numpy之random学习

numpy中pad函数的常用方法

转载于:https://www.cnblogs.com/LXP-Never/p/9638794.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值