Python记4(NumPy计算库

1、安装NumPy库:

pip install numpy   #在Anaconda中,已经安装了

2、数组属性:

ndim 数组的维数
shape 数组的形状
size 数组元素的总个数
dtype 数组中元素的数据类型
itemsize 数组中每个元素的字节数

>>>a.shape   #a=np.array([0, 1, 2, 3])
(4,)   #表示是一个一维数组,第一维度长度为4

3、创建数组:array([列表])或者array((元组))

也可以指定数据类型:array([列表]/(元组), dtype=数据类型) 数据类型下面将讲到

>>>a=np.array([0, 1, 2, 3]) 
>>>a
array([0, 1, 2, 3])
>>>type(a)
<class 'numpy.ndarray'>
>>>a[0:3]
array([0, 1, 2])   #注意没有3,前闭后开,等价于 a[:3])
>>>print(a)
[0, 1, 2, 3]
>>>type(a)
<class 'numpy.ndarray '>
>>>a[0]
0

3.1、多维数组:

array([[…这里一开始有多少个“[",第一个[划分第一个维度的不同元素
#二维数组及其切片

>>>b=np.array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])
>>>b
array([[ 0,  1,  2,  3],   #b[0]
       [ 4,  5,  6,  7],   #b[1]
       [ 8,  9, 10, 11]])  #b[2]
>>>b.shape
(3,4)    #有2个维度,第一个维度长度3,第二个维度长度4 
>>>b[0]
array([0,1,2,3]
>>>b[0:2]   #等价于b[:2],即第一个维度从0到1
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])
>>>b[0][1]   #等价于b[0,1]
1
>>>b[:2,2:]   #相当于b[0:2,2:4]
array([[2, 3],
       [6, 7]])
#三维数组
>>>c=np.array([[[0,1,2,3],[4,5,6,7],[8,9,10,11]],[[12,13,14,15],[16,17,18,19],[20,21,22,23]]])
>>>c
array([[[ 0,  1,  2,  3],       #c[0]
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],        #c[1]
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
>>>c.shape
(2,3,4)   #3个数字表示有3个维度,长度以此为2,3,4
>>>t.size
24   #共有24个元素
>>>t[0].shape
(3,4)  
>>>c[:,:,0]
array([[ 0,  4,  8],
       [12, 16, 20]])
>>>c[:,:,1]
array([[ 1,  5,  9],
       [13, 17, 21]])

3.2、数据类型:

数组中数据类型必须一样

int8、uint8、int16、uint16、int32、uint32、int64、uint64
float16、 float32、 float64、 float128
complex64、complex128、complex256
bool、object、string_、unicode_

>>>a=np.array([[0,1,2,3],dtype=np.int64)    #或者dtype=int64、'int64'、"np.int64"
>>>a
array([[0,1,2,3],dtype=int64)
>>>a.itemsize   #每个元素所占字节数
8
>>b=np.array([1.2,3.5,5.1])
>>>b.dtype
dtype('float64')     #由Python列表或元组创建时,由原来元素类型推导而来

3.3、创建特殊的数组:

np.arange(起始数字=0,结束数字,步长=1,dtype)    数字序列数组,前闭后开不包括结束数字
np.ones(shape, dtype)1数组,dtype可省
np.zeros(shape, dtype)0数组
np.eye(shape, dtype)                        单位矩阵
np.linspace(start,stop,num=50,dtype)        等差数列,(始值,末值,元素个数,类型),注意包括末值
np.logspace(start,stop,num=50,base=1,dtype) 等比数列

例如:

>>>np.arange(4)
array([0,1,2,3])
>>>np.arange(0,2,0.3)
array(0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
>>>np.ones((2,3))   #省略数据类型时仍有2重括号!
array([[1., 1., 1.],
       [1., 1., 1.]])
>>>np.eye(2)   #用 np.eye[::-1] 可以生成反对角矩阵
array([[1., 0.],
       [0., 1.]])
>>>np.eye(2,3)   #不是2个括号
array([[1., 0., 0.],
	    [0., 1., 0.]]) 
>>>np.linspace(1,4,4)
array([1., 2., 3., 4.])
>>>np.logspace(1,5,5, base=2)
arrray([2., 4., 8., 16., 32.])

3.4、asarray():将列表或元组转化为数组对象

对比array与asrray:当数据原来就是ndarray对象(n维数组)时,array()会复制新副本(占内存),而asarray()则不复制副本,而是直接引用原数组(共享内存)

arraylist1=[1,1]
arr1=np.array(list1)
arr2=np.asarray(list1)
list1[0]=2   #则输出arr1和arr2时,均为[1,1]
#对比:
arr3=np.ones((1,2))
arr4=np.array(arr3)
arr5=np.asarray(arr3)
arr3[0]=2    #则输出arr4为[1,1],输出arr5为[2,1],arr5跟着arr3变化

3.5改变数组形状:reshape(shape)、resize(shape)

创建新数组reshape(shape)、改变原数组resize(shape)

>>>b=np.arange(12)
>>>b
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
#reshape    #数组b没有改变形状,只是返回一个新的改变形状的数组
>>>b.reshape(3,4)      #也可以:b.reshape(-1,4)、b.reshape(3,-1),允许一个维度为-1,自动计算个数
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>>b
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
#resize    #原数组改变形状了,没有返回值的
>>>b.resize(3,4)    #也可以b=np.arange(12).resize(3,4),但不支持像上述reshape的-1操作
>>>b
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

4、加、减、乘、除

以加法为例:(乘法也是对应位相乘,不是矩阵乘法)

>>>a=np.array([0,1,2,3])
>>>b=np.array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])
>>>a+b     #一维数组和多维数组相加会将一维数组扩展为多维,再对应位相加
array([[ 0,  2,  4,  6],
       [ 4,  6,  8, 10],
       [ 8, 10, 12, 14]])

5、数组元素间的运算:

np.sum()   #计算所有元素的和     np.sum(B),返回值9,还可实现按行列求和
np.prod()  #计算所有元素的乘积
np.diff()  #计算数组的相邻元素之间的差
np.sqrt()  #计算各元素的平方根   np.sqrt(A**)
np.exp()   #计算各元素的指数值
np.abs()   #取各元素的绝对值
>>>np.diff(B)
array([[-2],
       [ 1]])
       
>>>t=np.arange(24).reshape(2,3,4)  #三维数组,秩为3,与线代中的秩含义不同
>>>t             #reshape(x1,x2,x3,x4...),xi分别对应axis=i
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
>>>np.sum(t,axis=0)
array([[12, 14, 16, 18],    #12=0+12,14=1+13,16=2+14
       [20, 22, 24, 26],    #axis=0就是第一个"[]"包起来的东西作为一个元素
       [28, 30, 32, 34]])   #求这些元素之和
>>>np.sum(t,axis=1)
array([[12, 15, 18, 21],   #12=0+4+8,15=1+5+9,18=2+6+10
       [48, 51, 54, 57]])  
>>>np.sum(t,axis=2)
array([[ 6, 22, 38],       #6=0+1+2+3,22=4+5+6+7,38=8+9+10+11+12 
       [54, 70, 86]])

6、数组合并:

6.1、堆叠运算:np.stack((数组1,数组2,…),axis)

#一维数组堆叠
>>>x=np.array([1,2,3])
>>>y=np.array([4,5,6])
>>>np.stack((x,y),axis=0)
array([[1, 2, 3],
       [4, 5, 6]])
#二维数组堆叠  
>>>m=np.arange(9).reshape(3,3) #m=array([[0, 1, 2],[3, 4, 5],[6, 7, 8]])
>>>n=np.arange(9,18).reshape(3,3)#array([[ 9, 10, 11],[12, 13, 14],[15, 16, 17]])
>>>np.stack((m,n),axis=0)   #shape:(2,3,3)
array([[[ 0,  1,  2],  
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]]])
np.stack((m,n),axis=1)   #shape:(3,2,3)
Out[72]: 
array([[[ 0,  1,  2],
        [ 9, 10, 11]],

       [[ 3,  4,  5],
        [12, 13, 14]],

       [[ 6,  7,  8],
        [15, 16, 17]]])
>>>np.stack((m,n),axis=2)   #shape:(3,3,2)
array([[[ 0,  9],
        [ 1, 10],
        [ 2, 11]],

       [[ 3, 12],
        [ 4, 13],
        [ 5, 14]],

       [[ 6, 15],
        [ 7, 16],
        [ 8, 17]]])

6.2、np.concatenate(数组,axis=0)

a=np.array([[1,2],[3,4]])
b=np.array([[5,6]])   #注意a、b维度相同
np.concatenate((a,b),axis=0)
Out[42]: 
array([[1, 2],
       [3, 4],
       [5, 6]])
np.concatenate((a,b.T),axis=1)
Out[43]: 
array([[1, 2, 5],
       [3, 4, 6]])

6.3增加一个维度:np.expand_dims(数组,axis=0)

见tf.expand_dims()

7、获取numpy array 数组中指定元素的索引位置

a = np.array([1,2,3,4,5,6,6,7,6])
a==6
b = np.where(a == 6)
print('b={} shape(b)={}' .format(b,np.shape(b)))
b=(array([5, 6, 8], dtype=int64),) shape(b)=(1, 3)
b[0][2]
Out[92]: 8

8、矩阵与矩阵运算

矩阵:matrix(字符串/列表/元组/数组),其中,matrix可以简写为mat

>>>a=np.mat('1 2 3;4 5 6')  #参数为字符串,各元素间用空格隔开,各行间用分号隔开,也可写为a=np.matrix(...
>>>a
matrix([[1,2,3]     #或者参数为python列表:b=np.mat([1,2,3],[4,5,6]]),返回值相同
        [4,5,6]])
>>>c=np.array([[1,2,3],[4,5,6]])
>>>d=np.mat(a)  #参数为NumPy数组,d与a相同

9、矩阵属性:

.ndim   矩阵的维数
.shape  矩阵的形状
.size   矩阵的元素个数
.dtype  元素的数据类型

10、数组实现矩阵运算,

返回的是数组类型:

>>>A=np.array([[1,1],[0,1]])
>>>B=np.array([[2,0],[3,4]])
>>>A
array([[1, 1],
       [0, 1]])
>>>B
array([[2, 0],
       [3, 4]])   
>>>·想·Thanks♪(・ω・)#矩阵乘法:matmul(A,B)
array([[5, 4],
       [3, 4]])       
>>>np.transpose(A)  #矩阵转置:transpose(A)
array([[1, 0],
       [1, 1]])
>>>np.linalg.inv(A) #矩阵求逆:np.linalg.inv(A)

11、matrix矩阵运算:

>>>a1=np.mat([[1,1],[0,1]]) #定义a1,a2两个矩阵
>>>a2=np.mat([[2,0],[3,4]])
>>>a1*a2         #矩阵乘法:*
matrix([[5, 4],
        [3, 4]])
>>>a1.T         #矩阵转置:.T  ,可非方阵转置
matrix([[1, 0],
        [1, 1]]) 
>>>a1.I         #矩阵求逆:.I  ,是大写的i,可非方阵求逆
matrix([[ 1, -1],
        [ 0,  1]])
>>>m=np.mat(np.array([[1,2,3],[4,5,6]]))
>>>m
matrix([[1,2,3],
        [4,5,6]])
>>>m.I
matrix([[-0.94444444, 0.44444444],
        [-0.11111111, 0.11111111],
        [ 0.72222222,-0.22222222]])  
>>>a1.T*a1     #矩阵乘以他的逆等于单位矩阵
matrix([[ 1,  0],
        [ 0,  1]])

矩阵运算比较:用矩阵运算运算符号简单,二维数组能表示高维数组、灵活、速度快

12、随机数模块:numpy.random

np.random.rand(d0,d1,...,dn)         元素在[01)区间均匀分布的数组       浮点数(返回值,下同)其中d0 d1...是维度数
np.random.uniform(low,high,size)     元素在[low,high)区间均匀分布的数组 浮点数 
numpy.random.randint(low,high,size)  元素在[low,high)区间均匀分布的数组 整数 
np.random.randn(d0,d1,...,dn)        产生标准正态分布的数组               浮点数   其中d0 d1...是维度数
np.random.normal(low,scale,size)     产生正态分布的数组                  浮点数

例如:

#创建2*3的随机数组,[0,1]内均匀分布
>>>np.random.rand(2,3)  
array([[0.72550754, 0.13158811, 0.57582693],
       [0.25416793, 0.28301289, 0.39419903]])
#参数为空,返回一个数字
>>>np.random.rand()
0.2734998983986443
#2*3的随机数组,[1,5]内均匀分布:
>>>np.random.uniform(1,5,(2,3))
array([[1.81097505, 1.62533782, 1.81681348],
       [1.21360233, 2.84165401, 3.54578057]])

13、随机种子:用seed()设置

(仅设置一次有效),一般默认是根据系统时间生成,随机种子一样则随机数一样。不同系统随机数生成算法不一样

>>>np.random.seed(612)
>>>np.random.rand(2,3)
array([[0.14347163, 0.49589878, 0.95454587],
       [0.13751674, 0.85456667, 0.42853136]])   #若seed(612)不变,则同一系统此数组值不变
>>>np.random.rand(2,3)
array([[0.36969445, 0.94758214, 0.09295099],
       [0.66035565, 0.84156851, 0.90694096]])  #随机数的种子不再是612了,因而值变了

14、打乱顺序函数:shuffle(序列) 、get_state、set_state

可Python的列表和NumPy数组等等

>>>arr=np.arange(10)
>>>print(arr)
[0 1 2 3 4 5 6 7 8 9]
>>>np.random.shuffle(arr)
>>>print(arr)
[7 2 8 4 9 6 5 0 1 3]
#对于多维数组,只能打乱第一维的元素:
>>>arr2=np.arange(12).reshape(4,3)
>>>print(arr2)
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
>>>np.random.shuffle(arr2)
>>>print(arr2)
[[ 0  1  2]
 [ 3  4  5]
 [ 9 10 11]
 [ 6  7  8]]

get_state():记录下数组被打乱的操作,
set_state():接收get_state()返回的值,并进行同样的操作

import numpy as np
a = np.arange(0,10,1)
b = np.arange(10,20,1)
print(a,b)
#result:[0 1 2 3 4 5 6 7 8 9] [10 11 12 13 14 15 16 17 18 19]
state = np.random.get_state()
np.random.shuffle(a)
print(a)
#result:[6 4 5 3 7 2 0 1 8 9]
np.random.set_state(state)
np.random.shuffle(b)
print(b)
#result:[16 14 15 13 17 12 10 11 18 19]

15、max(axis)

In [9]: arr1 = np.array([[1, 5, 3], [4, 2, 6]])

In [10]: arr1.max(axis=0)
Out[10]: array([4, 5, 6])

In [11]: arr1.max(axis=1)
Out[11]: array([5, 6])

In [12]: arr1.max()
Out[12]: 6

16、导入txt等的文件:

np.getfromtext(文件名,delimiter=‘分割字符’)
返回值是一个numpy数组,将文件读取出来,以分割字符划分数组的元素

17、交换维度:swapaxes

numpy.swapaxes(a,axis1,axis2)
In [115]: x=np.array([[1,2,3]])
In [116]: np.swapaxes(x,0,1)
Out[116]:
    array([[1],
           [2],
           [3]])
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在引用\[1\]中的例子中,Python函数使用了NumPy来进行数组的操作。NumPy是一个用于科学计算Python,它提供了高性能的多维数组对象和用于处理这些数组的工具。在这个例子中,函数将两个列表转换为NumPy数组,然后对它们进行相加,并将结果转换回列表返回。这样可以更高效地进行数组运算。\[1\] 在引用\[2\]中提到了一个错误录,这个错误可能是由于NumPy加载了多个DLL文件导致的。这个错误可以通过检查环境变量和文件路径来解决。确保只加载了一个正确的DLL文件。 在引用\[3\]中提到了配置项目属性的步骤,这是为了在项目中使用Python.h头文件和pythonXX.lib文件。这些文件是与Python解释器相关的文件,用于在C/C++代码中调用Python解释器的功能。根据你的Python版本,你需要将路径替换为你自己的Python安装路径,并在链接器中添加相应的pythonXX.lib文件。 综上所述,如果你在使用PythonNumPy时遇到了DLL相关的问题,你可以检查环境变量和文件路径,确保只加载了一个正确的DLL文件。另外,如果你需要在C/C++代码中调用Python解释器的功能,你需要配置项目属性,添加Python.h的包含目录和目录,并链接相应的pythonXX.lib文件。 #### 引用[.reference_title] - *1* *3* [将Python文件发布成DLL并调用](https://blog.csdn.net/zsh19980724/article/details/115518485)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Python Numpy loaded morethan1 DLL from .libs 报错解决方案](https://blog.csdn.net/a71468293a/article/details/129810649)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值