import numpy as np
ndarray是numpy库的主要对象,如果你生成了一个矩阵,然后调用type()方法去查看它的类型的话,它就会返回ndarray对象:
a = np.array([[1,2,3,4,5], [6,7,8,9,10]])
print(type(a))
#
理论上你可以用np.array()
方法生成任意维数的数组,不过在实际操作中我们不可能用到太高维度的矩阵,我本人最高也就用到过5维矩阵。
x = np.empty(shape = [2,5], dtype = int)
print (x)
# [[2128575739 1309500030 1661424176 1988385690 1324770695]
# [ 12290 0 0 0 0]]
注: 值是随机的,因为没有初始化。
参数:
参数名 | 描述 |
---|---|
shape | 矩阵尺寸 |
dtype | 元素数据类型 |
order | 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。(很少用到) |
x = np.zeros(shape = [2,5], dtype = int)
print (x)
# [[0 0 0 0 0]
# [0 0 0 0 0]]
x = np.ones(shape = [2,5], dtype = int)
print (x)
# [[1 1 1 1 1]
# [1 1 1 1 1]]
这里只列举一个简单的方法,后面会有更多其他关于随机矩阵的东西
[0,1) 之间,平均分布
x = np.random.rand(2,5)
print (x)
# [[0.67571794 0.95051445 0.77698268 0.28708719 0.96148028]
# [0.35231135 0.60493328 0.99423589 0.22146058 0.54518968]]
方法名 | 含义 |
---|---|
arange(n) | 返回ndarray类型,元素从0到n-1 |
full(shape,value) | 根据shape生成一个数组,每元素值全为value |
eye(n) | 一个正方形的n*n单位矩阵,对角线为1,其余为0 |
ones_like(a) | 与a同尺寸的全1矩阵 |
zeros_like(a) | 与a同尺寸的全0矩阵 |
full_like(a,value) | 与a同尺寸的全value值矩阵 |
linspace(start,stop,num) | 根据起止数据等间距地填充数据,形成数组 |
矩阵的参数有很多,只列举几个常见的,其余以后遇到再补
a=np.array([[1,2,3,4,5], [6,7,8,9,10]])
print(a.ndim)
# 2
这里有好多种获取方法,最常用的一般是len()
,a.shape
,前者只返回第1个维度的大小,后者返回一个数组,里面包括矩阵各个维度的大小
a = np.array([[1,2,3,4,5], [6,7,8,9,10]])
print(len(a), len(a[0, :]))
# 2 5
print(a.shape)
# (2, 5)
a = np.array([[1,2,3,4,5], [6,7,8,9,10]])
print(a.size)
# 10
我发现好像对于python的索引类型 M : N = [M, N),但是我没有找到确切的依据,如果有懂的大神敬请赐教。
如果是M : N : n,那就是在M和N之前按步长n取,这里不详细展开举例了
a = np.array([[1,2,3,4,5],
[6,7,8,9,10]])
print(a[0,:]) # 第1行
# [1 2 3 4 5]
print(a[:,2]) # 第3列
# [3 8]
print(a[:,:2]) # 前2列
# [[1 2]
# [6 7]]
print(a[:,1:4]) # 第2~4列 [2,4)
# [[2 3 4]
# [7 8 9]]
print(a[:,-3:]) # 后3列
# [[ 3 4 5]
# [ 8 9 10]]
M : N : n 表示在M和N之前按步长n取,这里不详细展开举例了
好像还可以自定义,没用过没见过没学过不懂先放这吧
# 删除一列
a = np.array([[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10]])
a = np.delete(a, 0, axis=1)
# 第一个参数是矩阵,第二个参数是要进行操作的行或列,第三个参数是维度,0代表行,1代表列,高维也可以
print(a)
# [[ 2 3 4 5]
# [ 7 8 9 10]]
numpy添加行的操作比较多,这里只介绍几种操作简单的,主要就是np.append(a,b,axis=)
,还有np.row_stack((a, 行元素))
和np.column_stack((a, 列元素))
a = np.array([[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10]])
a = np.append(a, [[0], [0]], axis=1)
# a = np.coloumn_stack((a, [[0], [0]]))
print(a)
# [[1 2 3 4 5 0]
# [6 7 8 9 10 0]]
如果np.append()
不指定axis,则返回一个一维的数组
上述的只适用于二维,而如果是 KMN 的三维数组要往里添加一个二维 M*N 的矩阵怎么办呢?
二维先扩展为三维 ,然后用np.vstack()
扩展
x = x[np.newaxis, :]
y=np.vstack((y, x)) # 或者y=np.append(y,x,axis=0)
N维变一维
a = np.array([[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10]])
a=a.flatten() # 返回一个数组的复制,这个函数就是专门将任意维的数组转换为1维的
a.shape=(-1) # 返回一个数组的复制
a.reshape(-1) # 同上
注意shape=[10]和shape=[1,10]不一样,前者是一维向量,后者是二维矩阵,np.reshape(-1)
和np.reshape(1,-1)
分别会得到上述两种结果。还有一个np.resize()
这个方法比较乱,不讨论了…什么简单用什么吧
其他维度的转换基本都是用np.reshape()
实现的,具体方法大差不差,不再赘述,但是问题是这个reshape的数据结构是什么倒是个值得深入探讨的事情,欢迎大神赐教。
两个矩阵的拼接一般np.append()
就可以搞定,具体参考上面的demo
两个以上的矩阵进行拼接一般使用np.concatenate((a1,a2,...), axis=)
a = np.array([[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10]])
b = np.concatenate((a, a), axis=0)
# [[ 1 2 3 4 5]
# [ 6 7 8 9 10]
# [ 1 2 3 4 5]
# [ 6 7 8 9 10]]
a.__contains__(0) # 返回布尔值
0 in a # 返回布尔
a == 0 # 返回一个和a同size的bool数组,每个元素代表a中同位置元素是否等于0,布尔量可以作为索引,具体例子看下图,懒得打了,判断两个矩阵是否相同也可以用这个方法
a = np.array([['1', '2', '3', '4', '5'],
['6', '7', '8', '9', '10']])
a=a.astype(float) # 此处写的是float 而不是np.float64, Numpy很聪明,会将python类型映射到等价的dtype上
# [[ 1. 2. 3. 4. 5.]
# [ 6. 7. 8. 9. 10.]]
# 其他类型的互换参考https://blog.csdn.net/lingbomanbu628/article/details/88657528
np.square() # 元素平方
pow(a,n) # 元素乘方,a^n
a**n # 元素乘方,a^n
np.sqrt() # 元素平方根
a.T # 矩阵转置
a.transpose(1,0,2) # 三维矩阵的第0个轴和第一个轴进行调换(转置),这个方法比较灵活,但是很容易弄错,如果不清楚高维numpy数组的数据结构的话
a.swapaxes(m,n) # 将a矩阵的第m维和第n维进行调换(转置)
np.dot(a,b) # 矩阵相乘(同线性代数),对于一维矩阵,计算两者的内积
np.multiply(a,b) # 矩阵元素相乘
a*b # 矩阵元素相乘
np.random.randint(low=0, high=9, size=40) # 生成尺寸为size,元素介于[0,9)之间的随机整数值
np.random.permutation(10) # 长度为10,从0到9乱序排列的数组
np.random.rand(2,5) # 服从“0~1”均匀分布的随机样本值。随机样本取值范围是[0,1),不包括1
np.random.randn(2,5) # 服从标准正态分布的随机样本值
a = np.array([64, 55, 26, 17, 8, 49, 120])
np.random.shuffle(a) # 此方法直接在传入参数上修改,不返回变量,多维矩阵中,只对第一维(行)做打乱顺序操作
# a=np.random.permutation(a) # 两个方法都可以,这个函数会返回一个打乱的复制,不会在原数组上修改
print(a)
# [ 8 120 55 64 49 17 26]
a = np.array([[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10]])
b = np.array([64, 55, 26, 17, 8, 49, 120])
np.savez_compressed('D:\\demo.npz',A=a,B=b) # A=a,A是保存的字典名,a是变量名
data=np.load('D:\\demo.npz')
a=data['A']
b=data['B']
numpy.load()返回的是一个类似于字典的变量,利用字典的用法就可以提取出里面的数组
np.savez_compressed()函数也可以只保存一个数组np.savez_compressed('D:\\demo.npz', a)
numpy官方文档
NumPy 创建数组
Python开发:NumPy学习(一)ndarray数组
np.linspace() 函数
np.random.rand()函数
如何在python中找到numpy矩阵的长度(或尺寸,大小)?
numpy矩阵删除一列或一行
python将两个二维array叠加成三维array的实现方法
Numpy中二维数组变一维数组的函数与思考
numpy中三维数组转变成二维数组
python基础之numpy.reshape详解
numpy基础教程–将二维数组转换为一维数组
python小白之数组索引
numpy数组拼接方法介绍(concatenate)
numpy中的几种矩阵乘法
详解Numpy数组转置的三种方法T、transpose、swapaxes
Python numpy 平方、乘方和平方根函数
Python3 * 和 ** 运算符
检查Numpy数组中是否包含单个元素
numpy.array()如何判断一个值是否在其中?
numpy.random.shuffle打乱顺序函数
numpy 中的随机打乱数据方法np.random.shuffle
np.random.rand()函数
Numpy.random中shuffle与permutation的区别
[Python]Numpy数据类型转换的方法