阅读前请看一下:我是一个热衷于记录的人,每次写博客会反复研读,尽量不断提升博客质量。文章设置为仅粉丝可见,是因为写博客确实花了不少精力。希望互相进步谢谢!!


文章目录

  • 阅读前请看一下:我是一个热衷于记录的人,每次写博客会反复研读,尽量不断提升博客质量。文章设置为仅粉丝可见,是因为写博客确实花了不少精力。希望互相进步谢谢!!
  • 前言
  • 1、维度究竟是行数还是列数?
  • 2、shape又是什么?
  • 3、常使用一维和二维,所以说一下初始化以及背后的转化。
  • 3.1、初始化
  • 3.2、常用的行向量、列向量初始化
  • 3.3、高维如何降到低维?
  • 4、为啥搞清维数那么重要?



前言

提示:这里可以添加本文要记录的大概内容:

学机器学习时,numpy的维度问题始终没搞清楚,今天总结了下。


提示:以下是本篇文章正文内容,下面案例可供参考

1、维度究竟是行数还是列数?

机器学习时总听到m维行向量、n维列向量。究竟维度是啥?这里的维度和numpy中一样嘛?

答案:不一样。

m维行向量:m维表示一行中有m列,由于是行向量,所以是1行m列
n维列向量:n维表示一行中有n行,由于是列向量,所以是n行1列
m维向量:看书的习惯了,一般书籍开头会说此本书以列向量为基准,那m维向量就指m维列向量了
矩阵:一般不说是几维,矩阵的表示一般就是dm。所以m维行向量也可以看作是m1的矩阵,n维列向量也可以看作是1*n的矩阵

但在numpy中维度概念不一样啊。numpy中维度就是平常所说的一维(只有x轴)、二维(x、y轴)、三维(x、y、z轴)…numpy中如何表示零维标量、一维、二维、三维等等?

标量print后只有一个数字
一维print后有一对花括号 [ ]
二维print后有两对 [ [] ]
三维print后有三对[ [ [] ] ]
依次类推…

注意,list里面也是同样规则。但list 和 ndarray背后有很大区别

import numpy as np
a = 12
print("a : ", a)
print("shape of a : ", np.shape(a))   #标量,0维
print("type of a : ",type(a))
print("_____________________________________")
b = np.array(12)
print("b : ", b)
print("shape of b : ", np.shape(b))   #标量,0维
print("type of b : ",type(b))
print("_____________________________________")
c = [12]
print("c : ", c)
print("shape of c : ", np.shape(c))   #一维向量
print("type of c : ",type(c))
print("_____________________________________")
d = np.array([12])
print("d : ", d)
print("shape of d : ", np.shape(d))   #一维向量
print("type of d : ",type(d))
print("_____________________________________")
e = np.array([12,13])
print("e : ", e)
print("shape of e : ", np.shape(e))   #一维向量
print("type of e : ",type(e))
print("_____________________________________")
f = np.arange(0, 20)
print("f : ", f)
print("shape of f : ", np.shape(f))   #一维向量
print("type of f : ",type(f))
print("_____________________________________")
g = np.array([[11],[12]])
print("g : ", g)
print("shape of g : ", np.shape(g))   #二维向量
print("type of g: ",type(g))

输出:

a : 12
shape of a : ()
type of a : <class ‘int’>

b : 12
shape of b : ()
type of b : <class ‘numpy.ndarray’>

c : [12]
shape of c : (1,)
type of c : <class ‘list’>

d : [12]
shape of d : (1,)
type of d : <class ‘numpy.ndarray’>

e : [12 13]
shape of e : (2,)
type of e : <class ‘numpy.ndarray’>

f : [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
shape of f : (20,)
type of f : <class ‘numpy.ndarray’>

g : [[11]
[12]]
shape of g : (2, 1)
type of g: <class ‘numpy.ndarray’>

2、shape又是什么?

形状呗。用 .shape 属性就能查看,或者 np.shape() 函数 也行。

() 表示零维。
(20,) 表示1维。区别(20),(20)python里等价于20。
(2,3) 表示2维。也就是所谓的矩阵了。线代里喜欢用 2*3 表示
(1,2,3) 表示3维。维度从右到左依次增高。

注意:

列向量或行向量即可看作一维,又可看作二维。例如[1,1,1]: 1、(3,) 即一维 2、(1,3)即二维,1*3的矩阵

3、常使用一维和二维,所以说一下初始化以及背后的转化。

3.1、初始化

import numpy as np
import pandas
# 1、np.array()初始化,传入一个list即可。
a1 = np.array(12)                             #0维,()
a2 = np.array([12])                           #1维,(1,)
a3 = np.array([12,13])                        #1维,(2,)
a4 = np.array([[12,13], [14,15]])             #2维,(2,2)
# 此函数在pandas.read_csv()导入数据集后得用
# df = pandas.read_csv('temperature_dataset.csv')
# data = np.array(df)

# 2、np.arange()初始化,只能初始化1维。传入start、stop、步长
b1 = np.arange(3, 7, 0.5)                      #1维

# 3、np.linspace()初始化,也是只能初始化1维
c1 = np.linspace(3, 7, num=5)                  #1维

# 4、np.zeros()初始化,传入shape。创建一个全是0的数组
d1 = np.zeros(5)                               #1维
print(d1)  
d2 = np.zeros((5,))                            #1维,和上面等价
print(d2)
d4 = np.zeros(2,3)                             #报错!!!
print(d4)
d3 = np.zeros((2,3))                           #2维
print(d3)

3.2、常用的行向量、列向量初始化

上面已经说了,行列向量既可以看作是一维,也可以看作是二维。所以都行两个不同维度初始化都行,不用纠结。

只是按照不同维度创建后需要很清楚背后的运算。 例如np.dot() 点积运算,如果不清楚自己当初设的是一维还是二维,那很有可能报错。

我习惯用二维表示。

因为在numpy里一维既可以做行向量也可以做列向量,那对于任意一个给定的一维向量,我们就无法确定他到底是行向量还是列向量,为了防止这种尴尬的境地,习惯上用二维矩阵而不是一维矩阵来表示行向量和列向量,因为二维必定能够确定他是行向量还是列向量。

3.3、高维如何降到低维?

最常用的就是二维如何转化成一维。

np.reshape()函数
np.squeeze()函数
np.flatten()函数
np.ravel()函数

4、为啥搞清维数那么重要?

原因如下:

1、划分数据集就很重要
2、很多公式的推导对应背后的代码,常常就是由于维度不匹配报错,
3、是用matlibplot画图时本该传一维当作x、y,但误传了二维导致无法正常画图。

4、就是广播操作时也需要清楚维度,否则可能因为不满足广播的维度而报错。


码字不易,谢谢点赞!!!
码字不易,谢谢点赞!!!
码字不易,谢谢点赞!!!