NumPy(Numerical Python) 是科学计算基础库,提供大量科学计算相关功能,比如数据统计,随机数生成等。
其提供最核心类型为多维数组类型(ndarray),支持大量的维度数组与矩阵运算,Numpy 支持向量处理 ndarray 对象,提高程序运算速度。
安装: pip install numpy
import numpy
nums = numpy.arange(10)
print(nums) # [0 1 2 3 4 5 6 7 8 9]
以上只涉及 numpy 模块中的一个 arange 函数,该函数可以传入一个整数类型的参数 n,函数返回值看着像一个列表,其实返回值类型是 numpy.ndarray。这是Numpy中特有的数组类型。
如果传入 arange 函数的参数值是 n,那么 arange 函数会返回 0 到 n-1 的 ndarray 类型的数组。
1. 数组的创建
numpy库可以用 array 函数、arange 函数创建数组,用numpy的random模块的random、randint、randn、normal创建不同的随机数,及其他方式创建数据。
1.1 array 创建
numpy 模块的 array 函数可以生成多维数组。例如,如果要生成一个二维数组,需要向array 函数传递一个列表类型的参数。每一个列表元素是一维的 ndarray 类型数组,作为二维数组的行。
另外,通过 ndarray 类的 shape 属性可以获得数组每一维的元素个数(元组形式),也可以通过 shape[n] 形式获得每一维的元素个数,其中 n 是维度,从0 开始。语法格式如下:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
- object 数组或嵌套的数列
- dtype 数组元素的数据类型,可选
- copy 对象是否需要复制,可选
- order 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
- subok 默认返回一个与基类类型一致的数组
- ndmin 指定生成数组的最小维度
创建一维数组:
控制台输出结果: [1 2 3 4 5 6] |
创建二维数组:
[[1 2 3] |
ndmin参数和dtype参数:
ndmin参数:指定生成数组的最小维度
[[[1 2 3 4 5 6]]] |
dtype参数:数组元素的数据类型
[1.+0.j 2.+0.j 3.+0.j 4.+0.j 5.+0.j 6.+0.j] |
1.2 arange创建
使用 arange 函数创建数值范围并返回 ndarray 对象,函数格式如下:
numpy.arange(start, stop, step, dtype)
- start : 起始值,默认为0
- stop : 终止值(不包括)
- step : 步长,默认为1
- dtype : 返回ndarray的数据类型,如果没有给,则会使用输入数据的类型
【示例】arange 生成 0 到 5 的数组 ;arange 设置了起始值、终止值及步长
[0 1 2 3 4 5] [10. 12. 14. 16. 18.] |
【示例】arange 创建二维数组
[[1 2 3] |
1.3 随机数创建
numpy.random.random(size=None)
该方法返回 [ 0.0, 1.0 ) 范围的随机数。参数 size 为随机数的数量,默认为None数量为1个。
import numpy as np
x = np.random.random(size=4) # 生成4个[0.0,1.0)之间的随机数
y = np.random.random(size=(3,4)) # 生成3组,每组个[0.0,1.0)之间的随机数
print(x)
print(y)
[0.04562541 0.53471819 0.43092769 0.5599242 ]
[[0.59529002 0.15003052 0.45964074 0.49118845]
[0.16284768 0.23298388 0.46419951 0.83983963]
[0.03162865 0.01147148 0.82274122 0.06954801]]
numpy.random.randint()
该方法有三个参数 low、high、size 三个参数。默认 high 是None,如果只有low,那范围就是 [0,low) 。如果有 high,范围就是 [low,high) 。
import numpy as np
x = np.random.randint(5,size=10) # 生成10个[0,low)范围的随机整数
print(x)
y = np.random.randint(5,10,size=10) # 生成10个[low,high)范围的整数
print(y)
z = np.random.randint(5,10,size=(2,4)) # 生成2*4个[low,high)范围的整数
print(z)
[1 2 1 3 4 1 1 0 0 0]
[6 8 5 9 8 5 8 6 9 5]
[[9 6 9 9]
[5 6 9 7]]
numpy.random.randn(d0,d1,…,dn)
randn 函数返回一个或一组样本,具有标准正态分布(期望为0,方差为1)。dn 表示每个维度,返回值为指定维度的 array
import numpy as np
x = np.random.randn()
print(x)
y = np.random.randn(2,4)
print(y)
z = np.random.randn(2,3,4)
print(z)
0.959216043254367
[[-0.27751908 -0.23905002 -1.68893817 1.00969689]
[ 0.4015471 0.2082427 -0.24210676 1.23384583]]
[[[-0.43519602 0.10923992 -0.72637305 2.31244038]
[ 0.60333821 1.18704964 -1.31302688 0.2451942 ]
[-0.30002402 1.20902392 -0.11996799 1.93968828]]
[[ 0.23977321 -0.82185041 1.75675118 -0.01669386]
[ 0.68526545 0.68450452 0.7146507 0.08698484]
[ 0.61900349 -0.51157511 -0.96765856 0.04767176]]]
numpy.random.normal() 指定期望和方差的正太分布
import numpy
x = numpy.random.normal(loc=3,scale=4,size=(2,2,3))
print(x)
[[[ 4.10836032 2.89186704 1.265006 ]
[ 4.05894883 6.71475964 1.52367961]]
[[-1.54105236 0.81934267 4.53406254]
[ 6.26913631 8.18430261 7.70574038]]]
1.4 ndarray对象
NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。
- ndarray 对象是用于存放同类型元素的多维数组。
- ndarray 中的每个元素在内存中都有相同存储大小的区域。
- ndarray 内部由以下内容组成:
-
- 一个指向数据(内存或内存映射文件中的一块数据)的指针。
- 数据类型或 dtype,描述在数组中的固定大小值的格子。
- 一个表示数组形状(shape)的元组,表示各维度大小的元组。
NumPy 的数组中比较重要 ndarray 对象属性有:
属性 | 说明 |
ndarray.ndim | 秩,即轴的数量或维度的数量 |
ndarray.shape | 数组的维度,对于矩阵,n行m列 |
ndarray.size | 数组元素的总个数,相当于.shape中n*m的值 |
ndarray.dtype | ndarray对象的元素类型 |
ndarray.itemsize | ndarray对象中每个元素的大小,以字节为单位 |
ndarray.flags | ndarray对象的内存信息 |
ndarray.real | ndarray对象的实部 |
ndarray.imag | ndarray对象的虚部 |
ndarray.data | 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。 |
ndarray属性示例:
numpy as np
x1 = np.random.randint(10,size=6)
print(x1)
x2 = np.random.randint(10,size=(3,4))
print(x2)
x3 = np.random.randn(3,4,5)
print(" ndim属性".center(20,"*"), "秩,即轴的数量或维度的数量")
print("ndim:", x1.ndim, x2.ndim, x3.ndim)
print(" shape属性".center(20,"*"), "数组的维度,对于矩阵,n 行 m 列")
print("shape:", x1.shape, x2.shape, x3.shape)
print(" dtype属性".center(20,"*"), "ndarray 对象的元素类型")
print("dtype:", x1.dtype, x2.dtype, x3.dtype)
print(" size属性".center(20,"*"), "数组元素的总个数,相当于 .shape 中 n*m 的值")
print("size:", x1.size, x2.size, x3.size)
print(" itemsize属性".center(20,"*"), "ndarray 对象中每个元素的大小,以字节为单位,1个字节是8位")
print("itemsize:", x1.itemsize, x2.itemsize, x3.itemsize)
打印结果:
[3 9 7 6 3 4]
[[8 4 5 3]
[4 0 5 1]
[8 7 5 6]]
****** ndim属性******* 秩,即轴的数量或维度的数量
ndim: 1 2 3
****** shape属性****** 数组的维度,对于矩阵,n 行 m 列
shape: (6,) (3, 4) (3, 4, 5)
****** dtype属性****** ndarray 对象的元素类型
dtype: int32 int32 float64
****** size属性******* 数组元素的总个数,相当于 .shape 中 n*m 的值
size: 6 12 60
**** itemsize属性***** ndarray 对象中每个元素的大小,以字节为单位,1个字节是8位
itemsize: 4 4 8
1.5 其他方式创建
ndarray 数组除了可以使用底层 ndarray 构造器来创建外,也可以通过以下几种方式来创建。
numpy.zeros 创建指定大小的数组,数组元素以 0 来填充:
numpy.zeros(shape, dtype = float, order = 'C')
|
[0. 0. 0. 0. 0.] [[0 0 0 0 0] [0 0 0 0 0]] |
numpy.ones 创建指定形状的数组,数组元素以 1 来填充:
numpy.ones(shape, dtype = None, order = 'C')
|
[1. 1. 1. 1. 1.] [[1 1 1 1] [1 1 1 1]] |
numpy.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组,里面的元素的值是之前内存的值:
numpy.empty(shape, dtype = float, order = 'C')
- shape: 数组形状
- dtype: 数组类型,可选
- order: 有"C"和"F"两个选项,分别代表行优先和列优先,在计算机内存中的存储元素的顺序
import numpy
x = numpy.empty([3,2], dtype=int, order='F')
print(x)
numpy.linspace 函数用于创建一个一维数组,数组是一个等差数列构成的,格式如下:
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
- start 序列的起始值
- stop 序列的终止值。如果endpoint为True,该值包含于数列中。
- mum 要生成的等步长的样本数量,默认为50。
- endpoint 该值为True时,数列中包含stop值,反之不包含。默认为True。
- retstep 如果为True时,生成的数组中会显示间距,反之不显示。默认为False
- dtype ndarray的数据类型,默认为float。
import numpy
x = numpy.linspace(1, 10, 10) # 生成样本数为10,起始为1,终止为10的数据(默认为float)
print(x)
[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
import numpy
x = numpy.linspace(10, 15, 10, endpoint=False) # 生成样本数为10,起始为10,终止为15(不包含)的数据(默认float)
print(x)
[10. 10.5 11. 11.5 12. 12.5 13. 13.5 14. 14.5]
import numpy
x = numpy.linspace(1, 5, 10, retstep=True, endpoint=True, dtype=int) # 生成样本数为10,起始为1,终止为5,类型为int 的数据,生成的数据带间距
print(x)
(array([1, 1, 1, 2, 2, 3, 3, 4, 4, 5]), 0.4444444444444444)
numpy.logspace 函数用于创建一个等比数列。格式如下:
numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
- start 序列的起始值为:base**start
- stop 序列的终止值为:base**stop (如果endpoint为True,该值包含于数列中)
- num 要生成的等步长的样本数量,默认为50
- endpoint 该值为True时,数列中包含stop值,反之不包含。默认为True
- base 对数log的底数
- dtype ndarray的数据类型,默认为float
import numpy
x = numpy.logspace(0, 9, 10, base=2) # 创建一个长度为10的等比数列,起始值为2的0次方,终止值为2的9次方
print(x)
[ 1. 2. 4. 8. 16. 32. 64. 128. 256. 512.]
2. 切片和索引
ndarray 对象的内容可以通过索引或切片来访问和修改,与 Python 中list 的切片操作一样。
ndarray 数组可以基于 0 - n 的下标进行索引,并设置 start, stop 及step 参数进行,从原数组中切割出一个新数组。
【示例】一维数组切片和索引的使用
import numpy
x = numpy.arange(10)
y = x[2:8:2] # 左开右闭原则,含索引为2,不含索引为8的元素
z = x[2:]
print("x = ",x,"\t","y = ",y,"\t","z = ",z)
x = [0 1 2 3 4 5 6 7 8 9] y = [2 4 6] z = [2 3 4 5 6 7 8 9]
【示例】根据索引直接获取
|
数组元素: [[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]] 获取第二行: [4 5 6] 获取第三行第2列: 8 |
【示例】二维数组切片的使用
|
数组元素: [[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]] 所有行的第2列: [ 2 5 8 11] 奇数行第1列: [1 7] |
【示例】使用坐标获取数组[x,y]
|
数组元素: [[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]] 获取第3行第2列: 8 同时获取第3行第2列,第4行第1列:(2种方法) [ 8 10] [ 8 10] |
【示例】索引为负数来获取
|
数组元素: [[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]] 获取最后一行: [10 11 12] 行倒序: [[10 11 12] [ 7 8 9] [ 4 5 6] [ 1 2 3]] 行列都倒序: [[12 11 10] [ 9 8 7] [ 6 5 4] [ 3 2 1]] |
所有切片取出来的数组,即使你把它赋值给了新的变量,它仍有全都是原来数组的视图。
【示例】切片数组的复制
|
[[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12]] [[1 2 3 4]] [[1000 2 3 4] [ 5 6 7 8] [ 9 10 11 12]] [[1000 2 3 4]] ########### copy ########## [[1000 2] [ 5 6]] [[1000 2 3 4] [ 5 6 7 8] [ 9 10 11 12]] [[2000 2] [ 5 6]] |
3. 改变数组的维度
处理数组的一项重要工作就是改变数组的维度,包含提高数组的维度 和 降低数组的维度,还包括数组的转置。
Numpy 提供的大量 API 可以很轻松地完成这些数组的操作。例如:
- 通过 reshape 方法可以将一维数组变成二维、三维或者多维数组。
- 通过 ravel 方法或 flatten 方法可以将多维数组变成一维数组。
- 改变数组的维度还可以直接设置Numpy 数组的shape属性(元组类型),通过 resize 方法也可以改变数组的维度。
|
打印结果: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23] [[12 13 14 15] |
4. 数组的拼接
通过 hstack 函数可以将两个或多个数组水平组合起来形成一个数组。
通过 vstack 函数可以将两个或多个数组垂直组合起来形成一个数组。
现在有两个 2*3 的数组 A 和 B。使用 hstack() 函数将A和B两个数组水平组合的:C = hstack(A, B) 使用 vstack() 函数将两个数组垂直组合代码:D = vstack(A, B)
数组A: [[ 0 1 2] |
数组B: [[ 6 7 8] |
数组C:
[[ 0 1 2 6 7 8] |
数组D: [[ 0 1 2 6 7 8] |
多个数组进行水平组合的效果类似。但数组水平组合必须要满足一个条件:就是所有参与水平组合的数组的行数必须相同,否则进行水平组合会抛出异常。
|
[[0 1 2] [3 4 5]] [[ 6 7 8] [ 9 10 11]] [[ 0 1 2 6 7 8] [ 3 4 5 9 10 11]] [[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]] |
数组的拼接有3个函数:
- concatenate 连接沿现有轴的数组序列
- hstack 水平堆叠序列中的数组(列方向)
- vstack 竖直堆叠序列中的数组(行方向)
numpy.concatenate 函数用于沿指定轴连接相同形状的两个或多个数组,格式如下:
numpy.concatenate((a1, a2, ...), axis)
参数说明:
- a1, a2, ...: 相同类型的数组
- axis: 沿着它连接数组的轴,默认为 0
numpy.hstack 它通过水平堆叠来生成数组。 |
[[1 2 3] [4 5 6]] [['a' 'b' 'c'] ['d' 'e' 'f']] [['1' '2' '3'] ['4' '5' '6'] ['a' 'b' 'c'] ['d' 'e' 'f']] 垂直方向拼接 相当于vstack [['1' '2' '3'] ['4' '5' '6'] ['a' 'b' 'c'] ['d' 'e' 'f']] 水平方向拼接 相当于hstack [['1' '2' '3' 'a' 'b' 'c'] ['4' '5' '6' 'd' 'e' 'f']] |
注意:如果拼接的行和列数目不同,则会报错
【示例】三维数组的拼接
import numpy
a = numpy.arange(1,37).reshape(3,4,3)
print(a)
b = numpy.arange(101,137).reshape(3,4,3)
print(b)
print("axis=0 "*10)
print(numpy.concatenate((a,b), axis=0))
print("axis=1 "*10)
print(numpy.concatenate((a,b), axis=1))
print("axis=2 "*10)
print(numpy.concatenate((a,b), axis=2))
- axis=0 可以使用 vstack 替换
- axis=1 可以使用 hstack 替换
- axis=2 可以使用 dstack 替换
5. 数组的分隔
5.1 split 分隔
numpy.split 函数沿特定的轴将数组分割为子数组,格式如下:
numpy.split(ary, indices_or_sections, axis)
参数说明:
- ary: 被分割的数组
- indices_or_sections: 如果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置。
- axis: 沿着哪个维度进行切向,默认为 0,横向切分。为 1 时,纵向切分。
【示例】split 分隔一维数组
|
打印结果: |
【示例】split 分隔二维数组
|
axis=0 垂直方向 平均分隔 [[1 2 3] [4 5 6]] [[11 12 13] [14 15 16]] axis=1 水平方向 按位置分隔 [array([[ 1, 2], [ 4, 5], [11, 12], [14, 15]]), array([[ 3], [ 6], [13], [16]])] |
5.2 水平分隔
分隔数组是组合数组的逆过程,与组合数组一样,分隔数组也分为水平分隔数组和垂直分隔数组。水平分隔数组与水平组合数组对应。
水平组合数组是将两个或多个数组水平进行收尾相接,而水平分隔数组是将已经水平组合到一起的数组再分开。
使用 hsplit 函数可以水平分隔数组,该函数有2个参数,第 1 个参数表示待分隔的数组,第 2 个参数表示要将数组水平分隔成几个小数组。
import numpy
x = numpy.array([numpy.arange(1,7), numpy.arange(7,13)])
h1 = numpy.hsplit(x, 2) # 水平分隔,平均分成2份
h2 = numpy.hsplit(x, 3) # 水平分隔,平均分成3份
2*6的二维数组 X: [[ 1 2 3 4 5 6] [ 7 8 9 10 11 12]] |
numpy.hsplit(X,2) 分隔的结果如下: [[[1 2 3] [7 8 9]] [[ 4 5 6] [10 11 12]]] |
numpy.hsplit(X,3) 分隔的结果如下: [[1 2] [7 8]] [[ 3 4] [ 9 10]] [[ 5 6] [11 12]] |
hsplit(X,2) 将数组 X 分隔成了列数相同的2个数组。hsplit(X,3) 将数组 X 分隔成了 3 个列数都为 2 的数组,但是 hsplit(X,4)分隔数组X就会抛出异常,因为数组 X 没有办法被分隔成列数相同的 4 个数组的。
所以使用hsplit函数分隔数组的一个规则就是:第 2 个参数值必须可以整除待分隔数组的列数。
【例子】hsplit 水平分割
|
gg: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]] |
a: [[ 0 1] [ 4 5] [ 8 9] [12 13]] |
b: [[ 2 3] [ 6 7] [10 11] [14 15]] |
5.3 垂直分隔数组
垂直分隔数组是垂直组合数组的逆过程。垂直组合数组是将两个或多个数组垂直进行首尾相接,而垂直分隔数组是将已经垂直组合到一起的数组再分开。
使用 vsplit 函数可以垂直分隔数组,该函数有2个参数,第 1 个参数表示待分隔的数组,第 2 个参数表示将数组垂直分隔成几个小数组。
import numpy
gg = numpy.arange(1,13).reshape(4,3)
print("gg:\n", gg)
a = numpy.vsplit(gg, 2) # 平均分隔成2份
print(a)
b = numpy.vsplit(gg, 4) # 平均分隔成4份
print(b)
4*3 的二维数组 X: gg: [[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]] |
numpy.vsplit(X,2) 分隔的结果如下: [array([[1, 2, 3], [4, 5, 6]]), array([[ 7, 8, 9], [10, 11, 12]])] |
numpy.hsplit(X,4) 分隔的结果如下: [array([[1, 2, 3]]), array([[4, 5, 6]]), array([[7, 8, 9]]), array([[10, 11, 12]])] |
第2个参数是整数:平均分隔成几个数组;第2个参数是数组,从索引为多少的位置分隔成多少份。
|
gg: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]] a: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] b: [[12 13 14 15]] |
*******分割成三部分******** x: [[0 1 2 3]] y: [[ 4 5 6 7] [ 8 9 10 11]] z: [[12 13 14 15]] |
【示例】transpose 进行转换
|
原数组a: [[ 1 2 3 4 5 6] [ 7 8 9 10 11 12]] 转置后的数组: [[ 1 7] [ 2 8] [ 3 9] [ 4 10] [ 5 11] [ 6 12]] |
原数组aaa: [[13 14 15 16] [17 18 19 20] [21 22 23 24]] [[25 26 27 28] [29 30 31 32] [33 34 35 36]]]] [[[13] [14] [15] [16]] [[17] [18] [19] [20]] [[21] [22] [23] [24]]] [[[25] [26] [27] [28]] [[29] [30] [31] [32]] [[33] [34] [35] [36]]]] |
标签:11,10,Python,数组,print,array,numpy From: https://www.cnblogs.com/rider-zhou/p/16614528.html