numpy的安装和创建

安装

## 1.以管理员的身份打开cmd

numpy的安装和创建

 输入以下命令安装numpy

pip	install	numpy

输入一下代码查询是否安装成功

pip list

 numpy的安装和创建

有numpy表示安装成功

数据创建

使用array创建

array语法

"""
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
"""
import numpy as np

#使用array创建一维数组
list01 = [1,2,3,4]
np01 = np.array(list01)
print(np01)
print(type(np01))
#使用array创建二维数组
list02 = [[1,2,3,4],[5,6,7,8]]
np02 = np.array(list02)
print(np02)
print(type(np02))
#使用array创建三维数组
list03 = [[[1,2,3,4],[5,6,7,8],[9,10,11,12]]]
np03 = np.array(list03)
print(np03)
print(type(np03))

 

array参数的使用

参数 参数及描述
Object 任何序列类型
dtype 数组的所需数据类型,可选。
copy 可选,默认为true,对象是否被复制。
order C(按行)、F(按列)或A(任意,默认)。
subok 默认情况下,返回的数组被强制为基类数组。如果为true,则返回子类。
ndimin 指定返回数组的最小维数。

#  Object  任何序列类型  
tuple01 = (1,2,3)
list01= [1,2,3]
set01 = {5,6,7}
dict01 ={"张三":10,"李四":20}
np01= np.array(dict01)
print(np01)

#dtype    数组的所需数据类型,可选。  
list01 = [1,2,3]
np01= np.array(list01,dtype=float)
print(np01)


"""
说明 np02 是 np01 的副本,两个是不同的对象
所以np02 和 np01 的数据不同
"""
list01 = [1,2,3]
np01= np.array(list01)
np02=np.array(np01,copy=True)
np02[0]=10
print(np01)
print(np02)
"""
可以看到数据是一样的,说明np02和np01是同一个对象
"""
list01 = [1,2,3]
np01= np.array(list01)
np02=np.array(np01,copy=False)
np02[0]=10
print(np01)
print(np02)

#由于order效果不明显,也不常用,在这里作为了解

#subok    默认情况下,返回的数组被强制为基类数组。如果为true,则返回子类。 
#matrix 是矩阵 之后会给大家详细讲解先回用
np01 = np.matrix('1 2 7; 3 4 8; 5 6 9')
print(type(np01))
print(np01)
np02 = np.array(np01, subok=True)
np03 = np.array(np01, subok=False)
print(type(np02)) #<class 'numpy.matrix'> 如果是true返回矩阵
print(type(np03)) #<class 'numpy.ndarray'>如果是False,强制改为了数组

#ndimin    指定返回数组的最小维数。  
list01 = [1,2,3]
np01= np.array(list01,dtype=float,ndmin=3)
print(np01)
 

使用arange创建

先来复习以下range函数
"""
range(start,stop,step)  函数可创建一个整数列表
1.不写start,默认从0开始
2.左开右闭
3.step步长,不写默认是1
"""
for i in range(10):
    print(i)

"""
arange(start,stop,step,dtype) 
1.不写start,默认从0开始
2.左开右闭
3.step步长,不写默认是1
"""
#一维数组
a = np.arange(10) #[0 1 2 3 4 5 6 7 8 9]
a = np.arange(2,10) #[2 3 4 5 6 7 8 9]
a = np.arange(1,10,2) #[1 3 5 7 9]
a = np.arange(1,10,2,dtype=float)
print(a)
#二维数组
#切记前面的12,必须满足3*4
np01  = np.arange(12).reshape(3, 4)
print(np01)

使用 random 创建数组

常用的random函数

函数 描述
np.random.random(size) 生成0到1之间的随机数
np.random.randint(low,high=None,size=None,dtype="1") 生成随机的整数
np.random.randn(d0,d1,d2,d3.........) 生成标准正态的随机数(期望为0,方差为1)
np.random.normal(loc,scale,size) 生成正态分布(指定期望和方差)
np.random.uniform(low,high,size) 生成均勻分布的随机数
np.random.shuffle() 随机打乱顺序
np.random.seed() 设置随机数种子
np.random.sample(size) 生成随机的浮点数

# np.random.random()    生成0到1之间的随机数  
#创建一维数组   size生成几个数据,可直接写4
np01= np.random.random(size=4) #[0.13475357 0.8088961  0.52055803 0.49706622]
#创建二维数组  size=(3,4) 3行4列 可用()和[] ,效果一样
np01= np.random.random((3,4))
#创建三维数组  两个三行四列
np01= np.random.random((2,3,4))
print(np01) 

 

"""
np.random.randint(low,high=None,size=None,dtype="1")   生成随机的整数  
low:开始
high=None :结束
size:长度
dtype数据类型,默认是int32  no01.dtype属性
1.左开右闭
2.不写low默认是0

"""
#创建一维数组
np01= np.random.randint(1,11,10)#1-10
#创建二维数组
np01= np.random.randint(1,11,(3,4))#1-10
#创建三维数组
np01= np.random.randint(1,11,(2,3,4))#1-10
print(np01)

 #创建标准的正态分布
#一维数组
np01=np.random.randn(4)
#二维数组
np01=np.random.randn(2,4)
#三维数组
np01=np.random.randn(3,2,4)
print(np01)

 """
np.random.normal(loc,scale,size)生成正态分布(指定期望和方差)
loc: 期望,默认0
scale: 方差,默认1.0
size: 长度
"""
np01= np.random.normal(size=5)
np01= np.random.normal(loc= 2,scale=3,size=5)
np01= np.random.normal(size=(2,3,5))
print(np01)

"""
np.random.uniform(low,high,size) 生成均勻分布的随机数
low: 不写默认是0,
high: 结尾,
: 长度
1.左开右闭
"""
np01= np.random.uniform(size= 4)#四个数据几乎不会相差太多,比较均匀
np01= np.random.uniform(size= (2,4))
np01= np.random.uniform(high=3)
print(np01)

 """
np.random.shuffle(ArrayLike)随机打乱顺序
"""
np01 = np.array([2,5,6,7,3])
print(np01)
np.random.shuffle(np01)
print(np01)

 """
np.random.seed()设置随机数种子
从每堆种子里选出来的数都是不会变的,从不同的堆里选随机种子每次都不一样,若想每次都能得到相同的随机数,每次产生随机数之前,都需要调用一次seed()
"""
np.random.seed(1)
np01= np.random.randint(1,10,size= 5)
np.random.seed(1)
np02= np.random.randint(1,10,size = 5)
print(np01)
print(np02)

"""
np.random.sample(size)  生成随机的浮点数
"""
np01= np.random.sample(size=2)
print(np01)
np02= np.random.sample(size=(2,3))
print(np02) 

 

使用zeros创建数组

 numpy.zeros(shaps,dtype=float,order="C") #创建指定大小的数组,数组以0填充

"""
numpy.zeros(shaps,dtype=float,order="C") #创建指定大小的数组,数组以0填充
shaps:维度
dtype:数据类型
order:按行按列
"""
np01= np.zeros(5) #[0. 0. 0. 0. 0.]
np01= np.zeros(5,dtype="int32")  #[0 0 0 0 0]
np01= np.zeros((2,5),dtype="int32") 
"""
[[0 0 0 0 0]
 [0 0 0 0 0]]
"""
print(np01) 

创建特定形状的多维数组

创建特定形状的多维数组

函数 描述
np.zeros((3, 4)) 创建3×4的元素全为0的数组
np.ones((3, 4)) 创建3×4的元素全为1的数组
np.empty((2, 3)) 创建2×3的空数组,空数据中的值并不为0,而是未初始化的垃圾值
np.zeros_like(ndarr) 以ndarr相同维度创建元素全为0数组
np.ones_like(ndarr) 以ndarr相同维度创建元素全为1数组
np.empty_like(ndarr) 以ndarr相同维度创建空数组
np.eye(5) 该函数用于创建一个5×5的矩阵,对角线为1,其余为0
np.full((3,5), 10) 创建3×5的元素全为10的数组,10为指定值

np01= np.ones((2,5),dtype="int32")
np01= np.empty((2,5),dtype="int32")
print(np01) 

list01= [
    [1,2,3],
    [4,5,6]
]
np01= np.array(list01)
print(np01.shape)
np02= np.zeros_like(np01,dtype=float)
print(np02)
print(np02.shape) 

#  np.eye(5)    该函数用于创建一个5×5的矩阵,对角线为1,其余为0  
np01= np.eye(5)
print(np01) 

# np.full((3,5), 10)    创建3×5的元素全为10的数组,10为指定值  
#10是指定的,你可以指定任意值
np01= np.full((3,5),5)
print(np01) 

使用linspace创建数组

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

参数 描述
start 序列的起始值
stop 序列的终止值 ,如果endpoint=True,则证明数组包含于数列
num 生成样本数量,默认是50
endpoint 如果为ture则包含stop,否则不包含
retstep 如果retstep=Ture,生成的数组会显示间距,否则不显示
dtype 数据类型

"""
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
"""
np01= np.linspace(1,10,5)#从1-10,生成5个数据
np01= np.linspace(1,10,5,endpoint=True)#把10包含进去
np01= np.linspace(1,10,5,endpoint=False)#把10不包含进去
np01= np.linspace(1,10,5,retstep=True)#显示间距
np01= np.linspace(1,10,5,dtype="int32")
print(np01) 

使用logspace创建数组

np.logspace(start,stop,num=50,endpoint=Ture,base=10.0,dtype=None)

参数 描述
start 序列的起始值
stop 序列的终止值 ,如果endpoint=True,则证明数组包含于数列
num 生成样本数量,默认是50
endpoint 如果为ture则包含stop,否则不包含
base 对数log的底数,默认10.0
dtype 数据类型

数组的属性

属性 描述
ndarray.ndim 数组的轴(维度)的个数。在Python世界中,维度的数量被称为rank。
ndarray.shape 数组的维度。这是一个整数的元组,表示每个维度中数组的大小。对于有n行和m列的矩阵,shape将是(n,m)。因此,shape元组的长度就是rank或维度的个数 ndim。
ndarray.size 数组元素的总数。这等于shape的元素的乘积。
ndarray.dtype 一个描述数组中元素类型的对象。可以使用标准的Python类型创建或指定dtype。另外NumPy提供它自己的类型。例如numpy.int32、numpy.int16和numpy.float64。
ndarray.itemsize 数组中每个元素的字节大小。例如,元素为float64类型的数组的itemsize为8(=64/8),而int32类型的数组的itemsize为4(=32/8)。它等于ndarray.dtype.itemsize。
ndarray.T 数组转置,及行列调换
ndarray.nbytes 整个数组所需的字节数量,可以使用nbytes属性。其值等于数组的size属性值乘以 itemsize属性值。

np01 = np.array([1,2,3,4])
np01 = np.array([[1,2,3,4]])
#print(np01.ndim)
print(np01.shape)
print(np01.size)
print(np01.dtype)
print(np01.itemsize) #一个字节默认是8为  32/8 = 4
print(np01.nbytes)#一个数字字节4,4*4=16 

list01 = [
    [1,2],
    [3,4],
    [5,6]
]
np01=np.array(list01)
print(np01)
np02= np01.T
print(np02) 

数据的索引和切片

一维数组的索引

list01= [1,2,3,4,5]
np01 = np.array(list01,dtype="int32")
print(np01)
"""
正向递增索引 从0开始
1,  2,  3,  4,  5 数据
0   1   2   3   4 索引
1.左开右闭
2.不写startIndex默认从0开始
"""
print(np01[0]) #1
print(np01[1:4]) #[2 3 4]
print(np01[1:5]) #[2 3 4 5]
print(np01[:5]) #[1 2 3 4 5]

"""
反向递减索引 从-1开始
1,  2,  3,  4,  5 数据
-5  -4  -3  -2  -1 索引
1.左开右闭
2.不写startIndex默认从0开始
"""
print(np01[-1]) #5
print(np01[-5:-1]) #[1 2 3 4]
print(np01[-5:]) #[1 2 3 4 5]

一维数组的切片

语法[start:stop:step]

 

list01= [1,2,3,4,5]
np01 = np.array(list01,dtype="int32")
print(np01)
#正向索引切片
print(np01[:])#从0到0
print(np01[3:])#从3开始到结尾
print(np01[:5])#从0开始到5结尾
print(np01[1:5:2])#步长是2

#反向索引切片
print(np01[::-1])#-1证明是反向获取
print(np01[-5:-2])

#正负一起使用
print(np01[-5:4]) #[1 2 3 4]

 

二维数组的索引

#创建二维数组
list01= [
    [1,2],
    [3,4],
    [5,6],
    [7,8]
]
np01= np.array(list01)
print(np01)
#print(np01.ndim) #查看维数
print(np01[1])#获取第二行
print(np01[1][1])#获取第二行第一列 

二维数组的切片

[对行进行切片,对列的切片]
对行的切片:可以有start:stop:step
对列的切片:可以有start:stop:step 

#创建二维数组
list01= [
    [1,2],
    [3,4],
    [5,6],
    [7,8]
]
np01= np.array(list01)
print(np01)
print(np01[:,:])#所有行所有列
#所有行部分列
print(np01[:,1])#所有行第二列
print(np01[:,0:2])#所有行的第一列和第二列

#部分列所有行
print(np01[1,:])#获取第二行所有列
print(np01[0:2,:])#获取第一和二行所有列
print(np01[::2,:])#获取奇数行所有列

#部分行部分列
print(np01[1,1])#第二行第二列

#组合使用的时候改怎么办
#获取第三行第二列(6),第四行第一列(7)
#行写成元组放在前面,列写成元组放在后面
a= np01[(2,3),(1,0)]
print(a)

#负索引的使用
print(np01[-1])#最后一行
print(np01[::-1])#行倒序
print(np01[::-1,::-1])#行倒序,列倒叙

 

数组的迭代

使用np.nditer迭代

最好no,知道常用的即可

op,flags,op_flags,op_dtypes,order={‘C’,‘F’,‘A’}, casting,op_axes, itershape, buffersize,

 

"""
flags : str的序列,可选。用于控制迭代器行为的标志。
  “buffered”可在需要时启用缓冲。
  “c_index”导致跟踪C顺序索引。
  “f_index”导致跟踪Fortran-order索引。
  “multi_index”导致跟踪多个索引或每个迭代维度一个索引元组。
  
op_flags:tr列表,可选。这是每个操作数的标志列表。至少,必须定“readonly”,“readwrite”或“writeonly”中的一个
  “readonly”表示只读取操作数。
  “readwrite”表示将读取和写入操作数。
  “writeonly”表示只会写入操作数。
  “no_broadcast”阻止操作数被广播。
  “contig”强制操作数数据是连续的。
  
op_dtypes : dtype的dtype 或tuple,可选。操作数所需的数据类型

order: {‘C’,‘F’,‘A’,‘K’},

casting :{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’},可选。控制进行复制或缓冲时可能出现的数据转换类型。建议不要将此设置为“unsafe”,因为它会对累积产生不利影响。
   “no”表示完全不应强制转换数据类型。
   “equiv”表示只允许更改字节顺序。
   “safe”表示只允许保留值的强制转换。
   “same_kind”意味着只允许安全的类型或类型内的类型,如float64到float32。
   “unsafe”表示可以进行任何数据转换。
   
op_axes : 整数列表列表,可选。如果提供,则是每个操作数的int或None列表。操作数的轴列表是从迭代器的维度到操作数的维度的映射。可以为条目放置值-1,从而将该维度视为“newaxis”。

itershape : 整数元组,可选。迭代器的理想形状。这允许“allocate”具有由op_axes映射的维度的操作数不对应于不同操作数的维度,以获得该维度不等于1的值。

buffersize : int,可选。启用缓冲时,控制临时缓冲区的大小。设置为0表示默认值
"""

#创建一维数组
np01 = np.arange(12)
print(np01)
for x in np.nditer(np01):
    print(x, end=' ')
    
#创建二维数组
np01 = np.arange(12).reshape(3, 4)
print(np01)
for x in np.nditer(np01):
    print(x, end=' ')

顺序迭代

"""
C按照行排序   F按照列排序
"""
data = np.arange(12).reshape(3, 4)
print('原始数组:')
print(data)
print('以C语言风格输出:')
for x in np.nditer(data, order='C'):
    print(x, end=' ')
print('\n以F语言风格输出:')
for x in np.nditer(data, order='F'):
    print(x, end=' ')
 

修改数组的元素

"""
比如我们把数组里面的每个数据都加1
1. nditer 里面有这样op_flags的参数可以设置读写
"""
import numpy as np 
np01 = np.arange(12).reshape(3, 4)
print('原始数组:')
print(np01)
for i in np.nditer(np01, op_flags=['readwrite']):
    i[...] = i +1
print('修改后的数组:')
print(np01)

外部循环

nditer迭代器提供了flags参数

参数 描述
c_index 可以跟踪C顺序的索引
f_index 可以跟踪Fortran 顺序的索引
multi-index 多索引/组合索引输出。输出的是坐标
external_loop 给出的值是具有多个值的一维数组
data = np.arange(12).reshape(3, 4)
print('原始数组:')
print(data)
print('修改访问顺序C风格的结果:')
#按照C(行)的风格输出下标
it = np.nditer(data, flags=['c_index'])
while not it.finished:#是否已经结束迭代
     print('%d<%d>' % (it[0], it.index), end=' ')
    it.iternext()#进入下一次迭代
print('修改访问顺序F风格的结果:')
#按照F(列)的风格输出下标
it = np.nditer(data, flags=['f_index'])
while not it.finished:
    print('%d<%d>' % (it[0], it.index), end=' ')
    it.iternext()
data = np.arange(12).reshape(3, 4)
print('原始数组:')
print(data)
it = np.nditer(data, flags=['multi_index'])
while not it.finished:
    print('%d<%s>' % (it[0], it.multi_index), end=' ')
    it.iternext()
data = np.arange(12).reshape(3, 4)
print('原始数组:')
print(data)
print('修改后的结果:')
#合并数组为一维数组
#默认按行合并一维数组
nd = np.nditer(data, flags=['external_loop'], order='F')
for x in nd:
    print(x, end= ' ')

广播迭代

import numpy as np 
np01 = np.arange(0, 60, 5).reshape(3, 4)
print  ('第一个数组为:')
print (np01)
print  ('\n')
print ('第二个数组为:')
np02 = np.array([1,  2,  3,  4], dtype = int)  
print (np02)
print ('\n')
print ('修改后的数组为:')
for x,y in np.nditer([np01,np02]):  
    print("%d:%d"  %  (x,y), end=", ")

数组操作

数值操作(+ - * /)

要求数组的shape必须一样

#数组与一维数组和二维数组的相乘
np01 = np.arange(9)#一维数组
i = 2
np02 = np01 *i
print(np01)
print(np02)
np03 = np.arange(9).reshape(3,3)#二维数组
np04 = np03 *i
print(np03)
print(np04)
​
#一维数组与一维数组相乘
#列数要一样
np01 = np.array([1,2,3,4,5])
np02 = np.array([6,7,8,9,0])
np03 = np01 * np02
print(np03)
​
#二维数组与二维数组相乘
np01 = np.arange(9).reshape(3,3)
print(np01)
np02 = np.arange(9).reshape(3,3)
print(np02)
np03 = np01 * np02
print(np03)
​
#一维数组和二维数组相乘
#进行了广播
np01 = np.array([1,2,3])#一维数组
print(np01)
np02 = np.arange(9).reshape(3,3)#二维数组
print(np02)
np03 = np01 * np02
print(np03)

"""
加减乘除一样的操作
"""
import numpy as np
data = np.array([1,2])
ones = np.ones(2,dtype="int32")
print(data)
print(ones)
add = data+ones
add = data-ones
add = data*ones
add = data/ones
add = data%ones
add = data//ones
print(add)
​
data = np.array([1,2])
print(data)
#不光可以数组在一起相加,相乘,数组也可以和int数据相加
add = data*1.6
print(add)

练习

import numpy as np
#计算一维数组和二维数组的余数
np01 = np.array([1,2,3])#一维数组
print(np01)
np02 = np.arange(9).reshape(3,3)#二维数组
print(np02)
np03 = np02 % np01 #切记余数不能为0
print(np03)

形状相关操作

形状函数 描述
reshape 不改变数据的条件下修改形状
flat 数组元素迭代器
flatten 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
ravel 返回展开的数组
"""
numpy.reshape(a, newshape, order='C') 这个函数在不改变数据的条件下修改形状
arr:要修改形状的数组    
newshape:整数或者整数数组,新的形状应当兼容原有形状  
order:'C'为C风格顺序,'F'为F风格顺序,'A'为保留原顺序。
"""
np01 = np.arange(10)#获取一个0-9的整数列表
print("原数组是:")
print(np01)
np02 = np.reshape(np01,(2,5),order="C")
np02 = np.reshape(np01,(2,5),order="F")
print(np02)
"""
numpy.ndarray.flat   该函数返回数组的一维迭代器
这是一个numpy.flatiter实例,其作用类似于Python的内置迭代器对象,但不是其子类
"""
​
import numpy as np
np01 = np.arange(9).reshape(3,3) 
print(type(np01)) #<class 'numpy.ndarray'>
print("原始数组")
for i in np01:
  print(i)
print("迭代后的数组")
itr = np01.flat#返回一个迭代器
print(itr)
#遍历后变成一个一个的数字
for i in itr:
  print(i,end=" ")
"""
np.ndarray.flatten(order='C') 就是把数组展开成一维数组
该函数返回一个一维的数组拷贝,对拷贝的修改对原始数组没有任何影响
Order:'C'--按行,'F'--按列,'A'--原顺序,'k'--元素在内存中的出现顺序。
"""
import numpy as np
np01 = np.arange(12).reshape(3,4)
print("原数组")
print(np01)
np02 = np01.flatten(order='C')
print("展开后,或者是变成一维数组后")
print(np02)
np02 = np01.flatten(order='F')
print("展开后,或者是变成一维数组后")
print(np02)
"""
函数返回展开的一维数组,并且按需生成副本。返回的数组和输入数组拥有相同数据类型
numpy.ravel(a,order='C')
​
"""
import numpy as np
np01 = np.arange(12).reshape(3,4)
print("原数组")
print(np01)
print(type(np01))
np02= np.ravel(np01)
print("展开后")
print(np02)
print(type(np02))

ravel()和flatten()的区别

"""
ravel()返回的是一个数组的视图
flatten()是一个浅拷贝,生成一个新的shu'zu
"""
import numpy as np
np01 = np.arange(12).reshape(3,4)
np02= np.ravel(np01)
np03 = np01.flatten()
"""
print("原数组")
print(np01)
print("ravel")
print(np02)
print("flatten")
print(np03)
"""
"""
看着一样的效果,我们修改一下数据
ravel生成的数组,改变数据回把原数组也改变了
flatten生成的数组,改变数据,不会修改原数组数据
"""
np02[0] = 9
np03[1] = 10
print("原数组")#原数组中的第1个数据改变成了9
print(np01)
print("ravel")
print(np02)
print("flatten")
print(np03)

练习

"""
把list01展开,按照列进行展开,并且不能修改源文件数据
"""
list01 = [
    [1,2,3,4],
    [5,6,7,8]
]
np01 = np.array(list01)
print("原数组")
print(np01)
np02 = np01.flatten(order='C')
print("展开后,或者是变成一维数组后")
print(np02)
np02 = np01.flatten(order='F')
print("展开后,或者是变成一维数组后")
print(np02)

合并与分割操作

数组的合并

函数 描述
concatenate(arrays, axis=0) 连接沿着现有轴的数据序列
stack(arrays, axis=0) 沿着新的轴连接数组序列
hstack(tup) 水平堆叠序列中的数组(列方向)
vstack(tup) 竖直堆叠序列中的数组(行方向)
import numpy as np 
np01 = np.array([[1,2],[3,4]])
print('第一个数组:') 
print(np01) 
np02 = np.array([[5,6],[7,8]])
print('第二个数组:') 
print(np02) 
​
#vstack(tup)竖直堆叠序列中的数组(行方向)
#按照行进行竖直的堆在一起
#vstack((np01,np02)) 里面是一个参数,所以两个数组必须用括号括起来
np03 = np.vstack((np01,np02))
print(np03)
#hstack(tup)水平堆叠序列中的数组(列方向)
#按照列进行合并
np03 = np.hstack((np01,np02))
print(np03)
"""
concatenate(arrays, axis=0 ) 连接沿着现有轴的数据序列
1.axis=0 默认是0
"""
np03 = np.concatenate((np01,np02),axis=0) #按照行方向进行拼接,相当于vstack(tup)
np04 = np.concatenate((np01,np02),axis=1) #按照列方向进行拼接,相当于hstack(tup)
print(np03)
print(np04)
"""
stack沿着新的轴连接数组序列
保持数组的原样,拼接起来
"""
np03 = np.stack((np01,np02),axis = 0) 
print(np03)
print(np03.shape)
​
np03 = np.stack((np01,np02),axis= 1) #按照行进行拼接
print(np03)
print(np03.shape)
​
np03 = np.stack((np01,np02),axis= 2) #按照列进行拼接
print(np03)
print(np03.shape)

数组的切分

把一个数组切割成多个数组

函数 描述
split 将一个数组分割为多个子数组
hsplit (array,i) 将一个数组水平分割为多个子数组(按列)
vsplit(array,i) 将一个数组垂直分割为多个子数组(按行)
import numpy as np 
list01 = [
    [1,2,3,4],
    [5,6,7,8],
    [9,10,11,12]
]
np01 = np.array(list01)
print('源数组:') 
print(np01) 
"""
numpy.split(ary, indices_or_sections, axis)
ary:被分割的数组
indices_or_sections:如果是一个整数,就用该数平均切分数组,如果是一个数组,为沿轴切分的位置
axis:沿着哪个维度进行切向,默认为0,横向切分。为1时,纵向切分
"""
np03,np04,np05 = np.split(np01,3)
print("=============================================")
print(np03)
print(np04)
print(np05)
print("=============================================")
np06 = np.split(np01,[3,4]) #按照数字3和4进行切分
np06 = np.split(np01,2,axis=1) #按照列进行切分
np06 = np.split(np01,3,axis=0) #按照横进行切分
print(np06)

import numpy as np 
list01 = [
    [1,2],
    [3,4],
    [5,6],
    [7,8],
    [9,10],
    [11,12],
]
np01 = np.array(list01)
print('源数组:') 
print(np01) 
#  `vsplit`    将一个数组垂直分割为多个子数组(按行)  
np03,np04,np05 =np.vsplit(np01,3)
print("==========================")
print(np03)
print("==========================")
print(np04)
print("==========================")
print(np05)
#  hsplit (array,i)  将一个数组水平分割为多个子数组(按列)  
np03,np04 =np.hsplit(np01,2)
print("==========================")
print(np03)
print("==========================")
print(np04)

数组的点乘

点乘(点积):也叫内积和数量积,是指两个数组进行乘积之后相加的运行算

比如

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

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

乘积 输出结果:70 = 1 * 5 + 2 * 6 + 3 * 7 + 4 * 8

import numpy as np
#数组与一维数组和二维数组的点乘
#如果是这种情况他和相乘效果一样
np01 = np.arange(9)#一维数组
i = 2
np02 = np.dot(np01 ,i)
print(np01)
print(np02)
np03 = np.arange(9).reshape(3,3)#二维数组
np04 = np.dot(np03 ,i)
print(np03)
print(np04)
#一维数组与一维数组点乘
#切记shape必须一样
np01 = np.array([1,2,3,4,5])
np02 = np.array([6,7,8,9,0])
np03 = np.dot(np01, np02)
print(np03)

#二维数组与二维数组点乘
#列和另一个数组的安行数一样
np01 = np.arange(8).reshape(2,4)
print(np01)
np02 = np.arange(9).reshape(4,2)
print(np02)
np03 = np.dot(np01 , np02)
print(np03)

练习

#一维数组和二维数组点乘
#列和另一个数组的安行数一样
np01 = np.array([1,2,3])#一维数组
print(np01)
np02 = np.arange(9).reshape(3,3)#二维数组
print(np02)
np03 =np.dot( np01 , np02)
print(np03)
​

数学操作

函数 描述
mean() 计算元素的均值
median() 计算中位数
std() 计算元素标准差
max() 计算元素的最大值或每一个横轴的最大值
min() 计算元素的最小值
count_nonzero() 计数
cumsum() 计算所有元素的累计和或每一个横轴按元素累加
sum() 所有元素求和或横轴元素求和
import numpy as np
a = np.array([[1, 2, 3],
              [4, 5, 6]])
#切记没有axis=3,只有0,1
#mean(array,axis=None)   计算元素的均值  
np02 = np.mean(a) 
np02 = np.mean(a,axis=1)#[2. 5.] 按照行
np02 = np.mean(a,axis=0)#[2.5 3.5 4.5]  按照列
                          
# median()   计算中位数  
np02 = np.median(a) 
                               
# std()      计算元素标准差   
np02 = np.std(a)
                       
# max()    计算元素的最大值或每一个横轴的最大值    
np02 = np.max(a)
np02 = np.max(a,axis=1)# 按照行
np02 = np.max(a,axis=0)# 按照列
 
# min()     计算元素的最小值 
np02 = np.max(a)
np02 = np.max(a,axis=1)# 按照行
np02 = np.max(a,axis=0)# 按照列
                          
# count_nonzero() | 计数     
np02 = np.count_nonzero(a)
np02 = np.count_nonzero(a,axis=1)# 按照行
np02 = np.count_nonzero(a,axis=0)# 按照列
                                   
# cumsum     计算所有元素的累计和或每一个横轴按元素累加
#如果axis不写
#先把数组变成一维数组[1, 2, 3,4, 5, 6]
#对数组进行累加0+1   1+2  3+3
np02 = np.cumsum(a)
np02 = np.cumsum(a,axis=1)# 按照行
np02 = np.cumsum(a,axis=0)# 按照列
​
# sum()      所有元素求和或横轴元素求和  
np02 = np.sum(a)    
np02 = np.sum(a,axis=1)          
np02 = np.sum(a,axis=0)     
print(np02) 

比较和逻辑操作

函数 描述
== 等于
> 大于
< 小于
!= 不等于
logical_and(a, b)
logical_or(a, b) 或者
logical_not(a)
#数字和一维数组或者二维数组的比较
#和每一个数值相比较
a = 3
b = np.array([1,2,3,4])
print(a == b)
a = 3
b = np.array([
       [1, 3],
       [9, 6]
])
print(a == b)
import numpy as np 
#一维数组和二维数组的比较
#一维数组的列和二维数组一样,那么比较每一个数据是否相等
a = np.array([9,6])
b = np.array([
       [1, 3],
       [9, 6]
])
print(a == b)
​
​
​
#二维数组和二维数组比较
a = np.array([
       [1, 5],
       [2, 6]
])
b = np.array([
       [1, 3],
       [9, 6]
])
print(a == b)
​
#一维数组和二维数组的比较
a = np.array([True,False])
b = np.array([
       [True,False],
       [True, True]
])
​
print(np.logical_and(a,b))
a = np.array([1,2])
b = np.array([
       [1,2],
       [1,0]
])
print(np.logical_and(a,b))
#数字和一维数组或者二维数组的比较
"""
a = 2
b = np.array([1,2,3,4])
print(np.logical_and(a,b))
a = True
b = np.array([True,False,False,False])
print(np.logical_and(a,b))
​
a = 3
b = np.array([
       [1, 3],
       [9, 6]
])
print(np.logical_and(a,b))
"""
#二维数组和二维数组比较
a = np.array([
       [True, False],
       [False, True]
])
b = np.array([
       [True, False],
       [True, True]
])
print(np.logical_and(a,b))
#很有可能0代表false
上一篇:numpy的安装和创建


下一篇:numpy的安装和创建