python—Numpy库第一天学习
1基础概念与优缺点
1.1概念:Numpy是python的第三方扩展包,主要用来计算、处理数组
1.2优点:Numpy可以便捷高效地处理大量数据,可以构建多维数组
1.3与列表(list)的区别
Numpy构建数组,必须是同类型数据,list构建列表,不一定需要同类型
2.构建数组
2.1利用array创建数组
二维数组
import numpy as np
arr=np.array([[1,2,3],[4,5,6]],order="c",copy=True,ndmin=2,dtype=np.float64)
print(arr)
'''输出为
[[1. 2. 3.]
[4. 5. 6.]]
'''
2.1.1array中的属性
order在Numpy库中,函数大多具有此属性):以哪种内存布局创建数组,有C行优先,F列优先,A默认
C的存储方式是按照arr[0,1],arr[0,2],arr[0,3]……方式存储
F的存储方式是按照arr[1,0],arr[2,0],arr[3,0]……方式存储
例如2.1中的例子:C是先存储1,2,3,再存储4,5,6
当改为F时,是先存储1,4再存储2,5最后存储3,6
copy:表示是否能够复制,默认为可复制(Ture),不可复制为False
ndmin:用于指定数据维度
维度可以理解为:数据外有几个[],就是几维:例如以上二维数组:[[1,2,3],[4,5,6]]表示二维数组,但维度序号是0,1。
dtype:表示数组的数据类型,有整数(int)、小数(浮点数)(float)、虚数(complex)8个字节为一个字符,如:int8,int16,float8,float16,complex64…..也可以缩写:i1,i2
f1,f2,c8….S表示字节串,a表示字符串如S8,a8
2.2利用empty创建数组
import numpy as np
arr=np.empty(shape=(2,3),dtype='i1',order='C')
print(arr)
此为创建一个二行三列的只有一个字符的整数数组
shape:表示创建数组的形状
但empty创建数组,数组里的元素是随机的
2.3zeros与ones创建数组
import numpy as np
arr=np.zeros(shape=(2,3),dtype='i1',order='C')
print(arr)
'''
输出为
[[0 0 0]
[0 0 0]]
'''
与前empty创建不同的点为:用zeros创建,元素都为0
用ones创建,元素都为1
import numpy as np
arr=np.ones(shape=(2,3),dtype='i1',order='C')
print(arr)
'''
输出为
[[1 1 1]
[1 1 1]]
'''
2.4arange创建数组
import numpy as np
arr1=np.arange(1,10,2,dtype='i1')
print(arr1)
'''
输出为:
[1 3 5 7 9]
'''
arange创建数组,就是从开始到结束(不包含)利用步长生成数组,步长默认为1,上图中的是(开始,截止,步长,数据类型)从1开始,到10结束,不包含10,步长为2
2.5linspace
import numpy as np
arr1,step=np.linspace(1,10,4,endpoint=True,retstep=True,dtype='i1')
print(step)
print(arr1)
'''
输出为:
3.0
[ 1 4 7 10]
'''
与arange创建数组相似,但最后一位是产生的数量,也就是说把1到10平均分成4份,默认是50份。
endpoint:默认为 True,表示数列包含 stop 终止值,反之不包含
retstep:表示是否返回步长。如果为 True,则返回一个包含数组和步长的元组;如果为 False,则只返回数组。默认为 False。
2.6full创建数组
import numpy as np
arr1=np.full((1,3),4,dtype='i1',order="c")
print(arr1)
'''
输出为:
[[4 4 4]]
'''
full与zeros、ones等类似,首先是要生成的数组形状(1,3)一行三列,其次是4,表示用4填充
ful_like也是一样,但最开始要输入生成数组的形状变成了,需要生成数组与其他数组形状一样的数组,例如:
import numpy as np
arr1=np.full((1,3),4,dtype='i1',order="c")
arr2=np.full_like(arr1,5)
print(arr2)
'''
输出为:
[[5 5 5]]
'''
3查看数组
3.1利用属性查看数组
3.1.1查看数组形状
利用shape属性查看
import numpy as np
arr=np.ones(shape=(2,3),dtype='i1',order='C')
print(arr.shape)
'''
输出为
(2, 3)
'''
此表示创建的数组为两行三列
3.1.2查看数组维度
利用ndim查看维度,记住:此属性关键词为ndim与设定维度ndmin关键词有所不同
import numpy as np
arr=np.ones(shape=(2,3),dtype='i1',order='C')
print(arr.ndim)
'''
输出为:
2
'''
表示生成的二维数组
3.1.3查看数组中元素的大小
itemsize查看数组中每个元素的大小,也就是字符数,字节为8表示一个字符数
array_one = np.array([[1,2,3],[4,5,6]],dtype=np.int8)
print('array_one 数组中每个元素的大小:',array_one.itemsize) #输出:1
表示每个元素只有一个字符
3.1.3查看内存信息
array_one = np.array([[1,2,3],[4,5,6]])
print('array_one 数数组的内存信息:\n',array_one.flags)
'''
输出:
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
'''
C_CONTIGUOUS:表示数组在内存中是 C 风格连续的(行优先)。如果为 True,则数组是 C 风格连续的。
F_CONTIGUOUS:表示数组在内存中是 Fortran 风格连续的(列优先)。如果为 True,则数组是 Fortran 风格连续的。
OWNDATA:表示数组是否拥有自己的数据(即是否是视图)。如果为 True,则数组拥有自己的数据;如果为 False,则数组可能是从另一个数组或对象借用数据的。
WRITEABLE:表示数组是否可写。如果为 True,则数组是可写的;如果为 False,则数组是只读的。
ALIGNED:
表示数组是否对齐。
如果为 True,则数组的数据在内存中是对齐的。
WRITEBACKIFCOPY:
表示数组是否是通过 np.copy 创建的副本,并且需要将更改写回原始数组。
如果为 True,则数组是通过 np.copy 创建的副本,并且需要将更改写回原始数组。
UPDATEIFCOPY:表示数组是否是通过 np.copy 创建的副本,并且需要将更改写回原始数组。
如果为 True,则数组是通过 np.copy 创建的副本,并且需要将更改写回原始数组。
3.2查看数组元素
3.2.1一维数组
一维数组可以直接利用for循环查看每个元素:
import numpy as np
arr=np.array([1,2,3,4,5,6],dtype='i1',order='C')
for i in arr:
print(i)
'''
输出为:
1
2
3
4
5
6
'''
3.2.2一维及多维元组元素查看
3.2.2.1利用flat查看
import numpy as np
arr=np.array([[1,2,3],[4,5,6]],dtype='i1',order='C')
for i in arr.flat:
print(i)
'''
输出为:
1
2
3
4
5
6
'''
flat返回一个迭代器,会将数组视为一个扁平化的一维数组,按行优先的顺序遍历所有元素。
3.2.2.2利用flatten查看
import numpy as np
arr=np.array([[1,2,3],[4,5,6]],dtype='i1',order='C')
print(arr.flatten(order="C"))
'''
输出为:
[1 2 3 4 5 6]
'''
其中order可以选的:C:按行优先顺序展开(默认),F:按列优先顺序展开。A:如果原数组是 Fortran 连续的,则按列优先顺序展开;否则按行优先顺序展开。K:按元素在内存中的顺序展开。
3.2.2.3利用ravel查看
import numpy as np
arr=np.array([[1,2,3],[4,5,6]],dtype='i1',order='C')
print(arr.ravel(order="C"))
'''
输出为:
[1 2 3 4 5 6]
'''
与flatten相似,但ravel是视图,flatten是副本,也就是说:ravel中某个元素改变,原数组的那个元素也改变,但flatten不会影响原数组
3.2.2.4bool索引
返回True或False
例如:
import numpy as np
arr=np.array([[1,2,3],[4,5,6],[7,8,9]],dtype='i1',order='C')
bool_dix=arr>5
print(bool_dix)
print("====")
print(arr[bool_dix])
'''
输出为:
[[False False False]
[False False True]
[ True True True]]
====
[6 7 8 9]
'''
数组[bool类型的索引]会返回满足条件的列表
3.3切片查看
3.3.1一维数组查看
利用slice函数从原数组中切割一个新数组
import numpy as np
arr=np.array([1,2,3,4,5,6],dtype='i1',order='C')
result=slice(0,len(arr),2)
print(arr[result])
'''
输出为:
[1 3 5]
'''
slice((开始,截止),步长)与创建函数的arange相似
3.3.2一维与多维函数
利用[]经行切片
import numpy as np
arr=np.array([[1,2,3],[4,5,6]],dtype='i1',order='C')
print(arr[0,1])
print(arr[0:,1])
print(arr[:1,1])
print(arr[1:2, 1:2])
'''
输出为:
2
[2 5]
[2]
[[5]]
'''
类似与列表切片,但元组切片中间是“,”号“:”表示以后,如以上的print(arr[0:,1])表示,索引行为0及以后行的索引为1的列元素
一维函数还可以利用“::”表示步长例:
import numpy as np
arr1=np.array([1,2,3,4,5,6],dtype='i1',order='C')
print(arr1[::2])
'''
输出为:
[1 3 5]
'''
4改变数组
4.1改变数组形状
4.1.1reshape
import numpy as np
arr1=np.array([1,2,3,4,5,6],dtype='i1',order='C')
print(arr1)
print(arr1.reshape(2,3))
print(arr1)
'''
输出为:
[1 2 3 4 5 6]
[[1 2 3]
[4 5 6]]
[1 2 3 4 5 6]
'''
reshape属性,不会改变原数组的数据形状,但reshape的元素改变,原数组的对应元素也会改变
4.1.2shape
import numpy as np
arr1=np.array([1,2,3,4,5,6],dtype='i1',order='C')
print(arr1)
arr1.shape=(2,3)
print(arr1)
'''
输出为:
][1 2 3 4 5 6]
[[1 2 3]
[4 5 6]]
'''
shape是直接改变原数组的数组形状
4.2数组转置
transpose与.T方法是相同的,都是把原数组进行转置
import numpy as np
arr1=np.array([[1,2],[3,4]],dtype='i1',order='C')
arr2=np.array([[5,6],[7,8]],dtype='i1',order='C')
print(np.transpose(arr1))
print("=====")
print(arr2.T)
'''
输出为:
[[1 3]
[2 4]]
=====
[[5 7]
[6 8]]
'''
4.3改变数组维度
4.3.1利用expand_dims添加维度
import numpy as np
arr1=np.array([[1,2],[3,4]],dtype='i1',order='C')
print(arr1)
print("===")
print(np.expand_dims(arr1,0))
'''
输出为:
[[1 2]
[3 4]]
===
[[[1 2]
[3 4]]]
'''
如上图所示:expand_dims(arr1,0)在索引为0前加一维度,但不会改变原维度,但如果元素改变了,原数组也会改变
4.3.2利用aqueeze渐少维度
import numpy as np
arr1=np.array([[[1,2],[3,4]]],dtype='i1',order='C')
print(arr1)
print("===")
print(np.squeeze(arr1,0))
'''
输出为:
[[[1 2]
[3 4]]]
===
[[1 2]
[3 4]]
'''
与expand_dims相似
4.3.3newaxis
它通常用于将一维数组转换为二维数组,或者在其他情况下增加数组的维度。
import numpy as np
arr1=np.array([1,2,3,4],dtype='i1',order='C')
print(arr1[:,np.newaxis])
print("===")
print(arr1[np.newaxis,:])
'''
输出为:
[[1]
[2]
[3]
[4]]
===
[[1 2 3 4]]
'''
4.4连接数组
4.4.1hstack(水平堆叠)
import numpy as np
arr1=np.array([1,2,3,4,5,6],dtype='i1',order='C')
arr2=np.array([7,8,9],dtype='i1',order='C')
print(np.hstack((arr1,arr2)))
'''
输出为:
[1 2 3 4 5 6 7 8 9]
'''
hstack简单来说就是吧行数相同的数组直接加到前数组中去
4.4.2vstack(垂直堆叠)
import numpy as np
arr1=np.array([[1,2,3],[4,5,6]],dtype='i1',order='C')
arr2=np.array([[7,8,9],[10,11,12]],dtype='i1',order='C')
print(np.vstack((arr1,arr2)))
'''
输出为:
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
'''
vstack简单来说就是把列数相同的数组,直接把后一个数组放到前数组的后面
4.5数组分割
4.5.1hsplit
import numpy as np
arr1=np.array([[1,2,3],[4,5,6]],dtype='i1',order='C')
for i in np.hsplit(arr1,(1,2)):
print(i)
print("===")
'''
输出为:
[[1]
[4]]
===
[[2]
[5]]
===
[[3]
[6]]
===
'''
hsplit就是按列索引分割,(索引是从0开始的)如上面(1,2)就是把列索引为1前面的分为一组(不包含1),再从列索引为2(不包含2)分割开
4.5.2vsplit
import numpy as np
arr1=np.array([[1,2,3],[4,5,6],[7,8,9]],dtype='i1',order='C')
for i in np.vsplit(arr1,(1,2)):
print(i)
print("===")
'''
输出为:
[[1 2 3]]
===
[[4 5 6]]
===
[[7 8 9]]
===
'''
与hsplit相似,但hsplit是按照行索引分割的
5矩阵计算
5.1广播计算
当数组加上一个数组时,但他们的形状不同时,行或列较少的数组会广播自己,使自己和较长数组形状相同
import numpy as np
arr1=np.array([[1,2,3],[4,5,6]],dtype='i1',order='C')
arr2=np.array([1,2,3],dtype='i1',order='C')
print(arr1+arr2)
'''
输出为:
[[2 4 6]
[5 7 9]]
'''
例如以上数组相加:arr2因为比较短,所以广播自己使自己变成与arr1相同形状变成了arr2=[[1,2,3],[1,2,3]]最后相加,此方法只能用在多为加一维数组,且一维的列数与多维的相等
当加实数时,也是把实数广播进行加减
import numpy as np
arr1=np.array([[1,2,3],[4,5,6]],dtype='i1',order='C')
print(arr1+1)
'''
输出为:
[[2 3 4]
[5 6 7]]
'''
先是把1广播维[[1,1,1],[1,1,1]]然后再经行计算
5.2自身计算(必须行和列相等)
利用linalg.det函数经行计算
import numpy as np
arr1=np.array([[1,2],[4,5]],dtype='i1',order='C')
print(np.linalg.det(arr1))
'''
输出为:
-2.9999999999999996
'''
5.3一维或二维矩阵相乘
利用dot函数经行
import numpy as np
arr1=np.array([1,2],dtype='i1',order='C')
arr2=np.array([3,4],dtype='i1',order='C')
print(np.dot(arr1,arr2))
'''
输出为:
11
'''
一维与一维矩阵相乘时,为点积运算,就是对应相乘相加,如上图为:1X3+2X4=11
多维乘多维时,为矩阵乘法运算:
import numpy as np
arr1=np.array([[1,2],[3,4]],dtype='i1',order='C')
arr2=np.array([[5,6],[7,8]],dtype='i1',order='C')
print(np.dot(arr1,arr2))
'''
输出为:
[[19 22]
[43 50]]
'''
matmul是专门用于矩阵乘法的函数
import numpy as np
arr1=np.array([[1,2],[3,4]],dtype='i1',order='C')
arr2=np.array([[5,6],[7,8]],dtype='i1',order='C')
print(np.matmul(arr1,arr2))
'''
输出为:
[[19 22]
[43 50]]
'''
作者:2301_78324739