numpy基础学习

numpy基础学习

1、numpy介绍

numpy是python的一个扩展程序,支持大量的维数数组与矩阵运算,同时对数组运算提供大量的数学函数库。numpy是一个运行速度非常快的数学库,主要用于数组计算,包括:
1、强大的N维数组对象ndarray;
2、广播功能函数;
3、整合C/C++/Fortran代码的工具;
4、线性代数、傅里叶变换、随机数生成等功能。

2、ndarray对象介绍

numpy最重要的一个特点就是其N维数组对象ndarray,它是一些列同类型数据的集合,集合中元素的索引从0开始。

2.1 ndarray语法结构

numpy.array(object,dtype=None,copy=True,order=None,subok=False,ndmin=0)
object,被操作对象,即数组或嵌套的数列
dtype,被操作对象元素的数据类型,可选
copy,对象是否需要复制,可选
order,创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
subok,默认返回一个与基类类型一致的数组
ndmin,指定生成数组的最小维度

#创建一维数组
data=np.array([1,2,3,4,5],dtype=int,copy=True,subok=False,ndmin=0)
print('一维:',data)

data1=np.array([[1,23,5],[56,0,2]])
print('二维:',data1)

结果:
一维: [1 2 3 4 5]
二维: [[ 1 23 5]
[56 0 2]]

2.2 numpy基本数据类型

名称描述
bool布尔数据类型(True或False)
int_默认的整数类型
intc与C的int类型一样,一般是int32或int64
int_默认的整数类型
intp用于索引的整数类型,一般情况下仍然是int32或int64
int8字节(-128 to127,-2^7 to 2^7-1)
int16整数(-2^15 to 2^15-1)
int32整数(-2^31 to 2^31-1)
int64整数(-2^63 to 2^63-1))
uint8无符号整数 0 to2^8-1
uint16无符号整数 0 to 2^16-1
uint32无符号整数 0 to 2^32-1
uint64无符号整数 0 to 2^64-1
float_flaot64类型的简写
float16半精度浮点数,包括1个符号位,5个指数位,10个尾数位
float32半精度浮点数,包括1个符号位,8个指数位,23个尾数位
float64半精度浮点数,包括1个符号位,11个指数位,52个尾数位
complex_complex128类型的简写,即128位复数
complex64复数,表示双32位浮点数(实数部分和虚数部分
complex128复数,表示双64位浮点数(实数部分和虚数部分

可以用dtype函数查看数据的类型

data=np.array([123456,34577856,6,68,-256,89.0])
print(data,data.dtype)

data1=np.array([1,2,3,5])
print(data1,data1.dtype)

[ 1.2345600e+05 3.4577856e+07 6.0000000e+00 6.8000000e+01 -2.5600000e+02 8.9000000e+01] float64
[1 2 3 5] int32

2.3 数组属性

属性说明
ndarray.ndim秩,即轴的数量或维度数量
ndarray.shape数组的维度,对于矩阵n行m列
ndarray.size数组元素的总个数,相当于shape中n*m的值
ndarray.dtypendarray对象中元素类型
ndarray.itemsizensarray对象中每个元素的大小,以字节为单位
ndarray.flagsndarray对象的内存信息
ndarray.realndarray元素的实部
ndarray.imagndarray元素的虚部
ndarray.data包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这话属性
data=np.arange(1,10).reshape((3,3))
print(data)
print('秩,ndim:',data.ndim)
print('数组维度,shape:',data.shape)
print('数组元素个数,size:',data.size)
print('数组元素类型,dtype:',data.dtype)
print('数组每个元素的大小,itemsize:',data.itemsize)
print('数组内存信息,flags:',data.flags)
print('数组元素的实部,real:',data.real)
print('数组元素的虚部,imag:',data.imag)
print(data.data)

数组: [[1 2 3]
[4 5 6]
[7 8 9]]

秩,ndim: 2

数组维度,shape: (3, 3)

数组元素个数,size: 9

数组元素类型,dtype: int32

数组每个元素的大小,itemsize: 4

数组内存信息,flags: C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : False
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False

数组元素的实部,real: [[1 2 3]
[4 5 6]
[7 8 9]]

数组元素的虚部,imag: [[0 0 0]
[0 0 0]
[0 0 0]]

<memory at 0x000001D0C05A0790>

3、数组的创建

函数说明
array将输入的数据(列表,元组,数组或其他序列类型)转换为ndarray
asarray将输入的数据转换为ndarray,若输入的已经是ndarray则不需要复制
arange根据给定范围直接返回ndarray数组,而不是列表
ones,ones_likeones表示生成一个由1组成的数组;ones_like表示返回与指定数组具有相同形状和数据类型的数组,并且数组元素都为1
zeros,zeros_likezeros表示生成一个由0组成的数组;zeros_like表示返回与指定数组具有相同形状和数据类型的数组,并且数组元素都为0
empty,empty_likeempty返回给定形状和类型的新数组,而不初始化,即将数组值设置为零,需要用户手动设置数组中的所有值;empty_like返回一个与给定数组具有相同形状和类型的新数组,相同的,该函数不初始化返回的数组;为此,改用 zeros_like 或 ones_like比设置数组值的函数稍微快一点。
full,full_likel返回与给定数组具有相同形状和类型的数组,并且数组中元素的值是fill_value的值
eye,identity创建一个N方单位矩阵

3.1 array 与 asarray

array与asarray将输入的数据转换成array

a=[1,2,3,4,5]
data=np.array(a)#将列表转换为array
print(data,data.dtype)
print('----------------------------')

tuple1=(12,35,67,89,32)
data=np.asarray(tuple1)#将元组转换成array
print(data)
print('----------------------------')

array1=np.arange(1,10).reshape((3,3))
array2=np.asarray(array1)
print(array1)
print('----------------------------')
print(array2)

----------结果--------------
[1 2 3 4 5] int32
----------------------------
[12 35 67 89 32]
----------------------------
[[1 2 3]
 [4 5 6]
 [7 8 9]]
----------------------------
[[1 2 3]
 [4 5 6]
 [7 8 9]]

3.2 arange

range 返回一个数组,其元素按间隔均匀间隔,与普通的内置range()函数相比,numpy.arange()可以生成非整数的数字序列。

data=np.arange(9)#间隔整数
print(data)
print(np.arange(1,5,0.5))#间隔为0.5

[0 1 2 3 4 5 6 7 8]
[1. 1.5 2. 2.5 3. 3.5 4. 4.5]

3.3 ones 和 ones_like

numpy.ones(shape, dtype)
ones表示生成一个由1组成的数组;ones_like表示返回与指定数组具有相同形状和数据类型的数组,并且数组元素都为1

data=np.ones(2,int)
data1=np.ones((2,2),float)
data2=np.ones([2,2],int)
print(data)
print('--------')
print(data1)
print('--------')
print(data2)

[1 1]

[[1. 1.]
[1. 1.]]

[[1 1]
[1 1]]

a=np.array([12,54,54])
b=np.array([[2,3,5],[6,8,7]])
a1=np.ones_like(a)

print(a1)
print(np.ones_like(b))

[1 1 1]

[[1 1 1]
[1 1 1]]

3.4 zeros 和 zeros_like

a=np.zeros(2,int)
b=np.zeros([3,3],float)

c=np.zeros_like([1,2,3])
aa=np.arange(9).reshape((3,3))
d=np.zeros_like(aa)

print(a)
print(b)
print(c)
print(d)

[0 0]

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

[0 0 0]

[[0 0 0]
[0 0 0]
[0 0 0]]

3.5 empty 和 empty_like

empty(shape, dtype)

a=np.empty(3,dtype=int)
b=np.empty([2,2],dtype=int)
c=np.empty([3,3],int)

print(a)
print(b)
print(c)

[-1107865200 464 0]

[[1 1]
[1 1]]

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

data=np.array([[1,2],[3,5]])
dada=np.array([1,2,3])
a=np.empty_like(data)
b=np.empty_like(dada)

print(a)
print(b)

[[1 2]
[3 5]]

[12 54 54]

3.6 full 和 full_like

full(shape, fill_value, dtype)返回一个形状和类型与fill_value填充的给定数组相同的新数组

a=np.full([2, 1], 67, dtype=int)
b=np.full([2, 3], 2)
c=np.full_like(a,0)
d=np.full_like(b,1)


print(a)
print(b)
print(c)
print(d)

[[67]
[67]]

[[2 2 2]
[2 2 2]]

[[0]
[0]]

[[1 1 1]
[1 1 1]]

3.7 eye 和 identity

a=np.eye(3,dtype=int)
b=np.identity(3)

print(a)
print(b)

[[1 0 0]
[0 1 0]
[0 0 1]]

[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]

3.8 特殊数组的创建:0元素数组

使用zeros函数创建指定维数的数组
zeros(shape,dtype,drder)

e=np.zeros((3,3),dtype=int)
print(e)

[[0 0 0]
[0 0 0]
[0 0 0]]

3.9 特殊数组的创建:1元素数组

使用ones函数创建指定维数的1元素数组
ones(shape,dtype,drder)

one=np.ones((3,3),dtype=int)
print(one)

[[1 1 1]
[1 1 1]
[1 1 1]]

3.10 特殊数组的创建:等差数列数组

使用linspace函数创建一个一维等差数列的数组,也可以用arange函数,但linspace更便捷。

linspace(start,stop,num=,endpoint=True,restep=False,dtype)
staert,序列的起始值
stop,序列的终止值,但endpoint=Ture时,该值包含在序列中
num,要生成等步长的样本数量,默认为50
endpoint,默认为True
retstep,如果restep=True,生成的数组会显示间距,反之不显示
dtype,元素类型

lin=np.linspace(10,100,num=100,endpoint=True,retstep=True,dtype=int)
data=np.arange(10,101)

print(lin)
print(data)

(array([ 10, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32,
33, 34, 35, 36, 37, 38, 39, 40, 40, 41, 42, 43, 44,
45, 46, 47, 48, 49, 50, 50, 51, 52, 53, 54, 55, 56,
57, 58, 59, 60, 60, 61, 62, 63, 64, 65, 66, 67, 68,
69, 70, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 90, 91,
92, 93, 94, 95, 96, 97, 98, 99, 100]), 0.9090909090909091)

[ 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
100]

3.11 特殊数组的创建:等比数列数组

等比数列用函数logspace函数来创建
logspace(start,stop,num,endpoint,base,dtype)
staert,序列的起始值为basestart
stop,序列的终止值为base
stop,但endpoint=Ture时,该值包含在序列中
num,要生成等步长的样本数量,默认为50
endpoint,默认为True
base,对数log的底数
dtype,元素类型

data=np.logspace(1,10,10,base=2)

print(data)

[ 2. 4. 8. 16. 32. 64. 128. 256. 512. 1024.]

4、数组数据索引与切片

ndarray对象的内容可以通过索引或切片来访问和修改。numpy切片语法与python列表的切片语法相同。索引与切片通常是联合运用。数组的索引总是使用方括号"[ ]"来索引数组的元素,以便对这些元素可以被单独引用。

4.1 put函数

put()函数用给定的元素去替换数组中的特定元素,是对原数组进行修改替换

语法结构:numpy.put(array, indices, p_array, mode = ‘raise’)
array :传入的数组
indices : 要获取的值的索引
p_array : 要放在目标数组中的值
mode : [{‘raise’, ‘wrap’, ‘clip’}, optional] 若索引越界,raise : [default]引发一个错误,wrap : 绕开,clip : 夹到范围内

da=np.array([1,46,7,4,9,2,8,72])
print(da)
a=np.put(da,[0,-1],[88,66])
print(da)#put函数是对原数组进行替换修改

data=np.array([[12,34,100],[56,78,99]])
print(data)
np.put(data,[3,4,0],[65,66,11])#多维数组时,以此为例[3,4,0]表示为索引为3,4,0的元素分别用65,66和11进行替换
print(data)

[ 1 46 7 4 9 2 8 72]

[88 46 7 4 9 2 8 66]

[[ 12 34 100]
[ 56 78 99]]

[[ 11 34 100]
[ 65 66 99]]

4.2 compress()函数?

compress()函数返回一个数组的选定切片

语法结构:compress(condition, array, axis = None, out = None)
condition :数组元素是由具有真值的。
array : 输入数组。用户在input_array元素上应用条件
axis : [optional, int]表示要选择的片断。默认情况下,是对扁平化的数组[1-D]工作。
out : [optional, ndarray]带有input_array元素的output_array。

a=np.arange(9).reshape((3,3))

print(a)
print(np.compress([1,0,1],a,axis=0))#截取第一行和第三行
print(np.compress([1,0,1],a,axis=1))#截取第一列和第三列

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

[[0 1 2]
[6 7 8]]

[[0 2]
[3 5]
[6 8]]

4.3 place()函数

place()函数根据参数-条件和值对数组进行更改,根据设置的掩码使用前n个值放入数组,其工作方式与numpy.extract()相反。

语法结构:place(array, mask, values)
array :输入需要修改的数组
mask :布尔值,必须与输入数组的大小相同。
values : 要放入数组的值。根据掩码条件,它只向数组添加N个元素。如果val中的值小于掩码,相同的值会被重复。

data=np.arange(1,10)
a=np.place(data, data>5, 0)

print(data)#对原数组进行操作
print(a)

[1 2 3 4 5 0 0 0 0]
None

4.4 diag_indices()函数-----访问数组的主对角线。

diag_indices返回一个对角线上的索引。接受两个参数,一个是n表示列表长度,一个是ndim,表示对角线索引的维度,默认为2.

语法结构:diag_indices(n, n_dim = 2)
n:数组的大小,每个维度都需要有二个元素的索引。
n_dim:维数的数目。

a=np.arange(9).reshape((3,3))
n= np.diag_indices(3)
print(n)

(array([0, 1, 2]), array([0, 1, 2]))

4.5 take()函数

take()根据提供的索引值将元素形成数组输出
语法结构:numpy.take(a,indices,axis = None,out = None,mode =‘raise’ )

a=np.arange(9).reshape((3,3))
print(a)
print(np.take(a,(1,2),axis=0))#获取索引为1,2的行
print(np.take(a,(1,2),axis=1))#获取索引为1,2的列

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

[[3 4 5]
[6 7 8]]

[[1 2]
[4 5]
[7 8]]

4.6 nonzero()函数

nonzero函数是numpy中用于得到数组array中非零元素的位置(数组索引)的函数。它的返回值是一个长度为a.ndim(数组a的轴数)的元组,元组的每个元素都是一个整数数组,其值为非零元素的下标在对应轴上的值。

data1=np.nonzero([1,2,3,0,4,0])
print('一维:',data1)
 
data2=[[7, 8, 0],[0, 5, 0],[1, 0, 3]]
nz=np.nonzero(data)
print('二维:',nz)
 
data3=[[[0,0],[1,0]],
        [[0,0],[1,0]],
        [[0,0],[1,0]]]
print('三维:',np.nonzero(data3))

一维: (array([0, 1, 2, 4], dtype=int64),)
二维: (array([0, 0, 1, 2, 2], dtype=int64), array([0, 1, 1, 0, 2], dtype=int64))
三维: (array([0, 1, 2], dtype=int64), array([1, 1, 1], dtype=int64), array([0, 0, 0], dtype=int64))

4.7 where()函数

where()函数返回输入数组中满足指定条件的元素的索引。

a=np.array([[1,2,1],[1,3,1],[1,4,2],[3,2,2]])
aa=np.where(a[:,2]==2)

print(aa)
print(a[aa])

(array([2, 3], dtype=int64),)
[[1 4 2]
[3 2 2]]

5、数组常见操作

5.1 修改数组形状

函数描述
reshape不改变数据的条件下修改形状
flat数组元素迭代器
flatten返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
ravel返回展开数组

reshape

data=np.arange(12).reshape((3,4))
da=data.reshape(4,3)
d=np.reshape(data,(4,3))

print(data)
print(da)
print(d)

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

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

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

flat
flat返回的是一个迭代器,可以用for访问数组每一个元素

a = np.arange(9).reshape(3,3)
print(a)
for i in a.flat:
    print(i)
    
#迭代器可以用list进行输出
print(list(a.flat),type(a.flat))#返回类型为 numpy.flatiter

b=a.flat[3]#可以用索引对迭代器进行引号
print(b)

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

0
1
2
3
4
5
6
7
8

[0, 1, 2, 3, 4, 5, 6, 7, 8] <class ‘numpy.flatiter’>

3

faltten
faltten 将数组的副本转换为一个维度,并返回,返回一个折叠成一维的数组。但是该函数只能适用于numpy对象,即array或者mat,普通的list列表是不行的。
flatten(order=’C’),可选参数,order:{‘C’,‘F’,‘A’,‘K’}
'C’行序优先
‘F’:列序优先
‘A’:if a is Fortran contiguous in memory ,flatten in column_major order
‘K’:按照元素在内存出现的顺序进行排序
默认为’C’

a = np.array([[4,5],[4,9]])
print(a)

b= a.flatten()#默认按行转换
print('默认C',b)

c = a.flatten('F')#换成列来划分
print('F',c)

d=a.flatten('A')#如果 a 在内存中是连续的 Fortran,则按column_major顺序平展
print('A',d)

e=a.flatten('K')#按照元素在内存出现的顺序进行排序
print('K',e)

[[4 5]
[4 9]]

默认C [4 5 4 9]

F [4 4 5 9]

A [4 5 4 9]

K [4 5 4 9]

ravel
ravel函数的作用是让多维数组变成一维数组

a = np.array([[4,5],[8,9],[1,2]])
print(a)

b=a.ravel()
print(b)

c=np.ravel(a)
print(c)

[[4 5]
[8 9]
[1 2]]

[4 5 8 9 1 2]

[4 5 8 9 1 2]

5.2 翻转数组

函数描述
transpose 、ndarray对换数组的维度,即转置
rollaxis向后滚动指定的轴
swapaxes对换数组的两个轴

transpose 、ndarray

import numpy as np
a = np.array([[4,5],[8,9],[1,2]])
print(a)
print(np.transpose(a))
print(a.T)

[[4 5]
[8 9]
[1 2]]

[[4 8 1]
[5 9 2]]

[[4 8 1]
[5 9 2]]

rollaxis
rollaxis(a, axis, start=0) 向后滚动指定的轴,直到它位于给定位置。

a = np.array([[[1,2,3],[4,5,6]],[[11,22,33],[44,55,66]]])
print(a)
print('1',np.where(a==1))
print('2',np.where(a==2))
print('3',np.where(a==3))
print('4',np.where(a==4))
print('5',np.where(a==5))
print('6',np.where(a==6))

b=np.rollaxis(a,1)
print(b)
print('1',np.where(b==1))
print('2',np.where(b==2))
print('3',np.where(b==3))
print('4',np.where(b==4))
print('5',np.where(b==5))
print('6',np.where(b==6))

[[[ 1 2 3]
[ 4 5 6]]

[[11 22 33]
[44 55 66]]]

1 (array([0], dtype=int64), array([0], dtype=int64), array([0], dtype=int64))
2 (array([0], dtype=int64), array([0], dtype=int64), array([1], dtype=int64))
3 (array([0], dtype=int64), array([0], dtype=int64), array([2], dtype=int64))
4 (array([0], dtype=int64), array([1], dtype=int64), array([0], dtype=int64))
5 (array([0], dtype=int64), array([1], dtype=int64), array([1], dtype=int64))
6 (array([0], dtype=int64), array([1], dtype=int64), array([2], dtype=int64))

[[[ 1 2 3]
[11 22 33]]

[[ 4 5 6]
[44 55 66]]]

1 (array([0], dtype=int64), array([0], dtype=int64), array([0], dtype=int64))
2 (array([0], dtype=int64), array([0], dtype=int64), array([1], dtype=int64))
3 (array([0], dtype=int64), array([0], dtype=int64), array([2], dtype=int64))
4 (array([1], dtype=int64), array([0], dtype=int64), array([0], dtype=int64))
5 (array([1], dtype=int64), array([0], dtype=int64), array([1], dtype=int64))
6 (array([1], dtype=int64), array([0], dtype=int64), array([2], dtype=int64))

swapaxes

a = np.arange(24).reshape((2,3,4))
print(a)

print(a.swapaxes(2,0))

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

[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]

[[[ 0 12]
[ 4 16]
[ 8 20]]

[[ 1 13]
[ 5 17]
[ 9 21]]

[[ 2 14]
[ 6 18]
[10 22]]

[[ 3 15]
[ 7 19]
[11 23]]]

5.3 修改数组维度

函数描述
broadcast产生模仿广播的对象
broadcast_to将数组广播到新形状
expand_dims扩展数组的形状
squeeze从数组的形状中删除一维条目

broadcast
广播规则:
1、如果两个数组的形状在任何一个维度上都不匹配,那么数组的形状会沿着维度为1的维度扩展以匹配另一个数组的形状
2、如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。
3、如果两个数组的形状在任何一个维度上都不匹配且没有任何一个维度等于 1 时,那么将会引发异常。

a=np.arange(9).reshape((3,3))
print(a)
b=np.array([10,20,30])

c=a+b
print(c)

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

[[10 21 32]
[13 24 35]
[16 27 38]]

broadcast_to

a=np.arange(6).reshape((1,6))
b=np.arange(6).reshape((6,1))

print(np.broadcast_to(a,(3,6)))
print(np.broadcast_to(b,(6,3)))

[[0 1 2 3 4 5]
[0 1 2 3 4 5]
[0 1 2 3 4 5]]

[[0 0 0]
[1 1 1]
[2 2 2]
[3 3 3]
[4 4 4]
[5 5 5]]

expand_dims
expand_dims(array, axis=0) 的主要作用,就是增加一个维度。
现在我们假设有一个数组a,数组a是一个两行三列的矩阵。设置axis为0,矩阵从23的二维矩阵变成了12*3的三维矩阵。

a=np.arange(6).reshape((2,3))
b=np.expand_dims(a, axis=1)

print(a)
print(b)

[[0 1 2]
[3 4 5]]

[[[0 1 2]]

[[3 4 5]]]

squeeze
squeeze(a,axis = None)函数可以删除数组形状中的单维度条目,即把shape中为1的维度去掉,否则将会报错,axis的取值可为None 或 int 或 tuple of ints, 可选。若axis为空,则删除所有单维度的条目;

5.4 连接数组

函数描述
concatenate连接现有轴的数组序列
stack沿新的轴加入一系列数组
hstack水平堆叠序列中的数组(列方向)
vstack竖直堆叠序列中的数组(行方向)

concatenate
concatenate((a1,a2,…), axis=0)函数。能够一次完成多个数组的拼接,适合大规模的数据拼接 。其中a1,a2,…是数组类型的参数

a=np.array([[1,2,3],[4,5,6]])
b=np.array([[11,21,31],[7,8,9]])

print(np.concatenate((a,b),axis=0))
print(np.concatenate((a,b),axis=1))  #axis=1表示对应行的数组进行拼接

[[ 1 2 3]
[ 4 5 6]
[11 21 31]
[ 7 8 9]]

[[ 1 2 3 11 21 31]
[ 4 5 6 7 8 9]]

stack、hstack、vstack
stack()会增加数组的维度,axis等于几就说明在哪个维度上进行堆叠

a=np.arange(1,7).reshape((2,3))
b=np.arange(7,13).reshape((2,3))
c=np.arange(13,19).reshape((2,3))

print(np.stack([a,b,c],axis=0))
print(np.stack([a,b,c],axis=0).shape)

print(np.stack([a,b,c],axis=1))
print(np.stack([a,b,c],axis=1).shape)

print(np.stack([a,b,c],axis=2))
print(np.stack([a,b,c],axis=2).shape)

[[[ 1 2 3]
[ 4 5 6]]

[[ 7 8 9]
[10 11 12]]

[[13 14 15]
[16 17 18]]]
(3, 2, 3)

[[[ 1 2 3]
[ 7 8 9]
[13 14 15]]

[[ 4 5 6]
[10 11 12]
[16 17 18]]]
(2, 3, 3)

[[[ 1 7 13]
[ 2 8 14]
[ 3 9 15]]

[[ 4 10 16]
[ 5 11 17]
[ 6 12 18]]]
(2, 3, 3)

a=np.arange(1,7).reshape((2,3))
b=np.arange(7,13).reshape((2,3))
c=np.arange(13,19).reshape((2,3))

print(np.hstack([a,b,c]))
print(np.vstack([a,b,c]))

[[ 1 2 3 7 8 9 13 14 15]
[ 4 5 6 10 11 12 16 17 18]]

[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]
[13 14 15]
[16 17 18]]

5.5 分割数组

函数描述
split将一个数组从左到右按顺序切分成多个数组
hsplit将一个数组水平分割成多个子数组(按列)
vsplit将一个数组垂直分割成多个子数组(按行)

split
语法结构:split(ary, indices_or_sections, axis=0)
ary:要切分的数组
indices_or_sections:如果是一个整数,spli函数只能用于均等分割,如果是一个数组,为沿轴切分的位置(左开右闭)
axis:沿着哪个维度进行切向,默认为0,横向切分。为1时,纵向切分

a=np.arange(1,10).reshape((3,3))

print(a)
print(np.split(a,3,axis = 0))#按行分割
print(np.split(a,3,axis = 1))#按列分割
print(np.split(a,[1,2,4],axis=1))#分割为(:,1]、(1,2]、(2,4],(4,:]4个数组左开右闭

#axis=1,代表列,是要把data数据集中的所有数据按第二、三列之间分割为X集和Y集。
x, y = np.split(a, (2,), axis=1)
print(x)
print(y)

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

[array([[1, 2, 3]]), array([[4, 5, 6]]), array([[7, 8, 9]])]

[array([[1],
[4],
[7]]), array([[2],
[5],
[8]]), array([[3],
[6],
[9]])]

[array([[1],
[4],
[7]]), array([[2],
[5],
[8]]), array([[3],
[6],
[9]]), array([], shape=(3, 0), dtype=int32)]

[[1 2]
[4 5]
[7 8]]

[[3]
[6]
[9]]

hsplit、vsplit

A=np.arange(9).reshape((3,3))

print(np.hsplit(A,3))# 水平方向分割
print(np.vsplit(A,3))

[array([[0],
[3],
[6]]), array([[1],
[4],
[7]]), array([[2],
[5],
[8]])]

[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]

5.6 数组元素的添加与删除

函数描述
resize返回指定形状的数组
append将值添加到数组末尾
insert沿指定轴将值插入指定下标之前
delete删除某个轴的子数组,并返回删除后的新数组
unique查找数组类唯一的元素,用于删除数组中重复元素

resize
resize改变数组的尺寸大小,reshape给数组一个新的形状而不改变其数据

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

#有返回值,不对原始数据进行修改
new=np.resize(a,(2,3))
print(new)
print(a)

[[0 1 2]
[3 4 5]]

[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]

append
axis=0,行数增加,列数不变,列数必须保持相同。
axis=1拓展列,行数不变,行数需要相同。
append规定,要么一个数组和一个数值;要么两个数组,不能三个及以上数组直接append拼接。

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

print(np.append(a,[[1,1]],axis=0))#维数要保持相同
print(np.append(a,[[1,1],[0,0]],axis=1))

[[0 1]
[2 3]
[1 1]]

[[0 1 1 1]
[2 3 0 0]]

insert
语法结构:insert(arr,obj,values,axis):
arr,需要插值的数组
obj,元素插入的位置
values,插入的数值
axis,默认为先对arr进行flatten操作,变为一维数组,然后再在对应的位置上插入对应的值。

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

b=np.insert(a,1,3)
print(a)
print(b)

c=np.insert(a, [1,2], [[6,3],[9,8]], axis=0)
print(c)

d= np.insert(a,(2,4),9)
print(d)

[[0 1]
[2 3]]

[0 3 1 2 3]

[[0 1]
[6 3]
[2 3]
[9 8]]

[0 1 9 2 3 9]

delete
语法结构:delete(array, object, axis = None)

a=np.arange(6).reshape((2,3))
b=np.delete(a,[1])
print(b)
print(np.delete(a,1))
print(np.delete(a,[2,3]))

[0 2 3 4 5]

[0 2 3 4 5]

[0 1 4 5]

unique
语法结构:unique(arr, return_index, return_inverse, return_counts, axis)
arr:输入的数组,如果不是一维数组则会展开
return_index:如果为True,返回新列表元素在旧列表中的位置(下标),并以列表形式储存
return_inverse:如果为True,返回旧列表元素在新列表中的位置(下标),并以列表形式储存
return_counts:如果为True,返回去重数组中的元素在原数组中出现的次数
axis

a=np.array([1,2,3,4,3,2,1,4,5,3,4,2,1,4])
print(a)
b=np.unique(a,return_index=True, return_inverse=True, return_counts=True)
print(b)

[1 2 3 4 3 2 1 4 5 3 4 2 1 4]
(array([1, 2, 3, 4, 5]), array([0, 1, 2, 3, 8], dtype=int64), array([0, 1, 2, 3, 2, 1, 0, 3, 4, 2, 3, 1, 0, 3], dtype=int64), array([3, 3, 3, 4, 1], dtype=int64))

5.7 数组排序

5.7.1 sort

语法结构:sort(arr,axis=-1,kind=‘quicksort’,order=None)
arr :要排序的数组。
axis :排序开始的轴,沿着数组的方法排序,0表示按行,1表示按列
kind :排序算法,快排[‘quicksort’{default},混排 ‘mergesort’, 堆排‘heapsort’]
order :如果数组包含字段,则要排序的字段,指定了要先比较哪些字段。

a=np.array([[12, 21], [5, 1]])
b=np.sort(a,axis =0)#按行
b1=np.sort(a,axis=1)#按列

print(b)
print(b1)

[[ 5 1]
[12 21]]

[[12 21]
[ 1 5]]

5.7.2 argsort

argsort函数返回的是数组值从小到大的索引值,其语法结构、参数说明与sort函数一致,其作用是对数组进行排序,犯回一个排序后的索引,数据没有改变

a=np.array([[12, 21], [5, 1]])
b=np.argsort(a,axis =0)#按列
b1=np.argsort(a,axis=1)#按行

print(a)
print(b)
print(b1)

[[12 21]
[ 5 1]]

[[1 1]
[0 0]]

[[0 1]
[1 0]]

5.7.3 lexsort

lexsort用于对多个序列进行排序,排序是优先照顾靠后的列,比如查看某个班级学生的总成绩排序时,若总成绩相同时,则根据数学成绩进行排序。

names=np.array(['A','B','C','D'])
ages=np.array([12,14,13,12])
total_scores=np.array([160,178,180,178])
math_scores=np.array([98,100,91,88])
index_lexsorted=np.lexsort((math_scores,total_scores))#按总成绩排序

print(index_lexsorted)
names_lexsorted=names[np.lexsort((math_scores,total_scores))]
print(names_lexsorted)

[0 3 1 2] # []中的数值为原数组的索引
[‘A’ ‘D’ ‘B’ ‘C’]#B和D的总成绩相同,但B的数学成绩比D高,因此B的排名比D高

6、函数

6.1 字符串函数

函数描述
add对两个数组的逐个字符串进行连接
multiply返回按元素多重连接后的字符串
center居中字符串
capitalize将字符串的第一个字母转换为大写
title将字符串的每个单词的第一个字母转换为大写
lower将数组元素转换为小写
upper将数组元素转换为大写
split按指定分隔符对字符串进行分隔,并返回数组列表
splitlines返回元素中的列表,以换行符分隔
strip移除元素开头或结尾处的特定字符
join通过指定分隔符来连接数组中的元素
replace使用新字符串代替字符串中的所有字符串
decode数组元素依次调用str.decode
encode数组元素依次调用str.encode
print(np.char.add('hello',['world']))	#add---['helloworld']
print(np.char.multiply('hello ',3))		#multiply---hello hello hello 
print(np.char.center('hello',10, fillchar = '*'))	#center---**hello***
print(np.char.capitalize(['hello world','java']))	#capitalize---['Hello world' 'Java']
print(np.char.title(['hello world','java']))	#title---['Hello World' 'Java']
print(np.char.lower(['Hello WorlD', 'Java'])	)	#lower---['hello wreld' 'java']
print(np.char.upper(['hello woeld', 'java']))	#upper---['HELLO WOELD' 'JAVA']
print(np.char.split('hello,how are you', sep = ','))		#split---['hello', 'how are you']
print(np.char.splitlines('hello\ngood monring'))	#splitlines---['hello', 'good monring']
print(np.char.strip(['good','god','going'],'g'))		#strip---['ood' 'od' 'oin']
print (np.char.join([':','-'],['good','job']))	#join---['g:o:o:d' 'j-o-b']
print(np.char.replace('she is good','good','beautiful'))	#replace---she is beautiful
print(np.char.encode('hello','GBK'))		#encode---b'hello'
print(np.char.decode(b'hello','GBK'))	#decode---hello

6.2 数学函数

函数描述
abs,fabs绝对值
squrt开方
square平方
exp指数
log,log10,log2,log1p对数
sign符号函数
ceil计算每个元素的上限整数
floor计算每个元素的下限整数
isnan返回布尔数组,指示每个值是否为NaN(不是一个数)
isfinite,isinf返回布尔阵列,指示每个元素是否为有限或无限
cos,cosh,sin,sinh,tan,tanh三角函数
arccos,arccosh,arcsin,arcsinh,arctan,arctanh反三角函数

6.3 算术函数

函数描述
add加法
subtract减法
multiply乘法
divide,floor_divide除法
power将第一个数组中的元素提升到第二个数组中指定的幂
maximum,fmax最大值
minimum,fmin最小值
mod除法余数
copysign将第二个参数中的值的符号复制到第一个参数中的值
greater,greater_equal,less,less_equal,equal,not_equal执行元素比较,生成布尔组(相当于插入操作符,>,>=,<,<=,==,!=)
logical_and,logical_or,logical_xor计算逻辑运算的元素真值(等价于运算符&,

6.4 统计函数

函数描述
amin计算数组中的元素沿指定轴的最小值
amax计算数组中的元素沿指定轴的最大值
ptp计算数组中的元素最大值与最小值之差
percentile计算数组的百分位数
median计算数组中元素的中位数
mean计算数组中元素的算术平均数
average根据在另一个数组中给出的各自的权重计算数组中元素的加权平均值
std计算数组中元素的标准差
var计算数组中元素的方差

7、矩阵

numpy中包含一个矩阵库numpy.matlib,该模块中的函数返回的是一个矩阵,而不是ndarray

7.1 空矩阵

语法结构:np.matlib.empty(shape,dtype,order)
shape:定义新矩阵形状的整数或整数元组
dtype:可选,数据类型
order:C(行优先)或F(列优先)
矩阵元素输出是随机变量

import numpy.matlib
import numpy as np
a=np.matlib.empty((3,3),dtype=int)
print(a)

[[ 98 101 97]
[117 116 105]
[102 117 108]]

7.2 零矩阵

numpy.matlib.zeros函数创建一个以0填充的矩阵

print(np.matlib.zeros((3,4)))

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

7.3 全1矩阵

numpy.matlib.ones函数创建一个以1填充的矩阵

print(np.matlib.ones((3,4)))

[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]

7.4 单位矩阵

numpy.matlib.identity函数返回一个给定的单位矩阵

print(np.matlib.identity(4))

[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]

7.5 对角矩阵

numpy.matlib.eye函数返回一个对角元素全为1,其他位置为0的矩阵
语法结构:numpy.matlib.eye(n,m,k,dtype)
n:返回矩阵的行数
m:返回矩阵的列数,默认为n
k:对角线的索引
dtype:数据类型

print(np.matlib.eye(n=3,M=5,k=-1,dtype=float))
print(np.matlib.eye(n=4,M=5,k=0,dtype=float))
print(np.matlib.eye(n=5,M=5,k=1,dtype=float))

[[0. 0. 0. 0. 0.]
[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]]

[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]]

[[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]
[0. 0. 0. 0. 0.]]

7.6 随机矩阵

numpy.matlib.rand函数创建一个给定大小的矩阵,数据是随机填充的

print(np.matlib.rand((4,4)))

[[0.88129619 0.06966126 0.97488963 0.63595235]
[0.65913145 0.71170856 0.81599032 0.32102196]
[0.80852689 0.81151333 0.33323786 0.79308415]
[0.44776359 0.28596506 0.64932724 0.03875443]]

本文仅供学习交流

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值