Numpy中的矩阵运算

1.创建数组相关

1.1创建数组: .array

首先需要创建数组才能对其进行其它操作,通过给array函数传递Python的序列对象创建数组,如果传递的是多层嵌套的序列,将创建多维数组(如c):

import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array((5, 6, 7, 8))
c = np.array([[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]])
print (a)
print ('---')
print (b)
print ('---')
print (c)
# 输出 [1 2 3 4]
---
[5 6 7 8]
---
[[ 1  2  3  4]
 [ 4  5  6  7]
 [ 7  8  9 10]]
  • 若导入numpy用的是import numpy命令,那么在创建数组的时候用a = numpy.array([1, 2, 3, 4])的形式
  • 若导入numpy用的是import numpy as np命令,那么用 a = np.array([1, 2, 3, 4])

1.2创建0矩阵: .zeros

np.zeros((3, 4)) # 创建3行4列的0矩阵
np.zeros((3, 4), dtype=np.str) # 可以在创建的时候指定数据类型

1.3创建1矩阵: .ones

np.noes((3, 4)) # 创建3行4列的1矩阵

1.4区间内按等差创建矩阵: .arange

np.arange(10, 30, 5) # 10开始到30,没加5生成一个元素
# 输出array([10, 15, 20, 25])
# 可以通过修改shape属性改变维度,参考上文

np.arange(0, 2, 0.3) # 0开始到2,没加0.3生成一个元素
# 输出array([0, 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])

np.arange(12).reshape(3, 4) # 从0开始每加1共生成12个元素,并通过reshape设定矩阵大小为3行4列
# 输出array([[0, 1, 2, 3],
             [4, 5, 6, 7],
             [8, 9, 10, 11]])

np.random.random((2, 3)) # 生成2行3列矩阵,元素为0-1之间的随机值

1.5区间内按元素个数取值: .linspace

from numpy import pi
np.linspace(0, 2*pi, 100) # 0到2*pi,取100个值

1.6创建时指定元素类型

import numpy as np
a = np.array([[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]])
b = np.array([[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]], dtype='str')
print (a)
print ('---')
print (b)
# 输出 [[ 1  2  3  4]
 [ 4  5  6  7]
 [ 7  8  9 10]]
---
[['1' '2' '3' '4']
 ['4' '5' '6' '7']
 ['7' '8' '9' '10']]

1.7array数组的数据类型

bool – True , False
int – int16 , int32 , int64
float – float16 , float32 , float64
string – string , unicode

2.数组属性相关

2.1查询矩阵的大小: .shape

import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]])
print (a.shape)
print ('---')
print (b.shape)
# 输出 (4,)
---
(3, 4)

(4, )shape有一个元素即为一维数组,数组中有4个元素
(3, 4)shape有两个元素即为二维数组,数组为3行4列

2.2改变shape

b.shape = 4, 3
print (b)
# 输出 [[ 1  2  3]
 [ 4  4  5]
 [ 6  7  7]
 [ 8  9 10]]

当某个轴的元素为-1时,将根据数组元素的个数自动计算该轴的长度,下面程序将数组b的shape改为了(2, 6):

b.shape = 2, -1
print (b)
# 输出 [[ 1  2  3  4  4  5]
 [ 6  7  7  8  9 10]]

2.3查询维度: .ndim

import numpy as np
a = np.array([[5, 10, 15],
       [20, 25, 30],
       [35, 40, 45]])
a.ndim
# 输出 2

2.4查询元素个数: .size

import numpy as np
a = np.array([[5, 10, 15],
       [20, 25, 30],
       [35, 40, 45]])
a.size
# 输出 9

2.5查询数据类型: .dtype

# 接上面数据
print (c.dtype)
# 输出 int32

关于数据类型:List中的元素可以是不同的数据类型,而Array和Series中则只允许存储相同的数据类型,这样可以更有效的使用内存,提高运算效率。

2.6转换数据类型: .astype

# 接上面数据
b = b.astype(int)
print (b)
# 输出 [[ 1  2  3  4]
 [ 4  5  6  7]
 [ 7  8  9 10]]

使用数组的reshape方法,可以创建一个改变了尺寸的新数组,原数组的shape保持不变:

a = np.array((1, 2, 3, 4))
b = a.reshape((2, 2))
b
# 输出 array([[1, 2],
       [3, 4]])

3.复制数组相关

3.1复制(1): = 浅拷贝

a和b共享数据存储内存区域,因此修改其中任意一个数组的元素都会同时修改另外一个数组或矩阵的内容:

a[2] = 100 # 将数组a的第3个元素改为100,数组d中的2即第三个元素也发生了改变
b
# 输出 array([[1, 2],
       [100, 4]])
import numpy as np
a = np.arange(12)
b = a

print (a)
print (b)
print (b is a) # 判断b是a?
# 输出 [ 0  1  2  3  4  5  6  7  8  9 10 11]
	[ 0  1  2  3  4  5  6  7  8  9 10 11]
	True

b.shape = 3, 4
print (a.shape)
# 输出 (3, 4)

print (id(a))
print (id(b))
# 输出 2239367199840
	2239367199840

3.2复制(2)–浅复制: .view()

# The view method creates a new array object that looks at the same data.

import numpy as np
a = np.arange(12)
b = a.view() # b是新创建出来的数组,但是b和a共享数据

b is a # 判断b是a?
# 输出 False
print (b)
# 输出 [ 0  1  2  3  4  5  6  7  8  9 10 11]
b.shape = 2, 6 # 改变b的shape,a的shape不会受影响
print (a.shape)
print (b)
# 输出 (12,)
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]
b[0, 4] = 1234 # 改变b第1行第5列元素为1234,a对应位置元素受到影响
print (b)
# 输出 [[   0    1    2    3 1234    5]
		 [   6    7    8    9   10   11]]
print (a)
# 输出 [   0    1    2    3 1234    5    6    7    8    9   10   11]

3.3复制(3)–深复制: .copy()

# The copy method makes a complete copy of the array and its data.

import numpy as np
a = np.arange(12)
a.shape = 3, 4
a[1, 0] = 1234

c = a.copy()
c is a
c[0, 0] = 9999 # 改变c元素的值,不会影响a的元素
print (c)
print (a)
# 输出 [[9999    1    2    3]
 [1234    5    6    7]
 [   8    9   10   11]]
[[   0    1    2    3]
 [1234    5    6    7]
 [   8    9   10   11]]

4.统计操作

4.1基本运算 求和 求最大值 求最小值 求平均值

import numpy as np
test1 = np.array([[5, 10, 15],
	        [20, 25, 30],
	        [35, 40, 45]])
test1.sum()
# 输出 225
test1.max()
# 输出 45
test1.min()
# 输出 5
test1.mean()
# 输出 25.0
按行
test1 = np.array([[5, 10, 15],
	        [20, 25, 30],
	        [35, 40, 45]])
test1.sum(axis=0)
# 输出 array([60, 75, 90])
按列
test1 = np.array([[5, 10, 15],
	        [20, 25, 30],
	        [35, 40, 45]])
test1.sum(axis=0)
# 输出 array([60, 75, 90])

5.矩阵的判断

5.1利用==判断数组或矩阵中是否存在某个值

在这里插入图片描述

将判断结果赋给某个变量
在这里插入图片描述
在这里插入图片描述

5.2一次判断多个条件

在这里插入图片描述

6.矩阵的数学运算

6.1矩阵乘法

对应位置相乘

import numpy as np
a = np.array([[1, 2],
              [3, 4]])
b = np.array([[5, 6],
              [7, 8]])
print (a*b) # 对应位置元素相乘

矩阵点乘

print (a.dot(b)) # 矩阵乘法
print (np.dot(a, b)) # 矩阵乘法,同上
# 输出
      [[19 22]
       [43 50]]
      [[19 22]
       [43 50]]  

6.2元素求平方:

a = np.range(4)
print (a)
print (a**2)
# 输出 [0, 1, 2, 3]
      [0, 1, 4, 9]

6.3元素求e的n次幂: np.exp(test)

6.4元素开根号: np.sqrt(test)

import numpy as np
test = np.arange(3)
print (test)
print (np.exp(test)) #e的n次幂
print (np.sqrt(test)) #开根号
# 输出 [0 1 2]
	[1. 2.71828183 7.3890561]
	[0 1. 1.41421356]

6.5向下取整: .floor()

import numpy as np
test = np.floor(10*np.random.random((3, 4)))
print (test)
# 输出 [[ 3.  8.  7.  0.]
	 [ 5.  9.  8.  2.]
	 [ 3.  0.  9.  0.]]

6.6平坦化数组: .ravel()

# 二维n行n列转换为一维数组
test.ravel()
# 输出 array([ 3.,  8.,  7.,  0.,  5.,  9.,  8.,  2.,  3.,  0.,  9.,  0.]) 
# 数据接上面,下同

6.7矩阵转置: .T

test.shape = (6, 2)
print (test)
# 输出 [[ 3.  8.]
 [ 7.  0.]
 [ 5.  9.]
 [ 8.  2.]
 [ 3.  0.]
 [ 9.  0.]]
test.T # test的转置
# 输出 array([[ 3.,  7.,  5.,  8.,  3.,  9.],
       [ 8.,  0.,  9.,  2.,  0.,  0.]])

6.8矩阵拼接按行列拼接

  • np.vstack((a, b)) 行
  • np.hstack((a, b)) 列
import numpy as np
a = np.floor(10*np.random.random((2, 2)))
b = np.floor(10*np.random.random((2, 2)))
print (a)
print ('---')
print (b)
print ('---')
print (np.vstack((a, b))) # 按行拼接,也就是竖方向拼接
print ('---')
print (np.hstack((a, b))) # 按列拼接,也就是横方向拼接
# 输出 [[ 5.  3.]
 [ 8.  0.]]
---
[[ 3.  0.]
 [ 6.  3.]]
---
[[ 5.  3.]
 [ 8.  0.]
 [ 3.  0.]
 [ 6.  3.]]
---
[[ 5.  3.  3.  0.]
 [ 8.  0.  6.  3.]]
  • 7
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值