[python]numpy、列表向量函数、查找、排序等 个人笔记

numpy 相关 (或list)

构造矩阵/向量


a = np.zeros((2,3)) #(一定要两层括号)
a = np.random.randn(5,1)
np.arange(0, samplePerChannel)
#python的二维数据表示要用二层括号来进行表示。
#如:产生一个2×3的全0矩阵,若是zeros(2,3)这种写法就会出现 TypeError: #data type not understood  这种错误; 
# 正确的写法是 zeros((2,3))

numpy与list相互转换

a = np.zero(1,1)
a.tolist()
b = [[1,2,3],[3,4,5]]
b = np.array(b)

numpy读写csv或txt

np.loadtxt(f, delimiter=",", skiprows=41, usecols=np.arange(1, 107))
np.savetxt('features.csv', features, fmt='%.8e', delimiter=',')  

取元素,长度

len(my_list)
my_array.shape  #3,5
'''numpy'''
data([row,col]) # 只能numpy,不能list
data([row,:]) # the whole row
data([:,col]) # the whole col
data([row,start:end:step) # include start, not include end
'''list'''
my_list[1] #
my_list[-1] # 最后一个元素

增删改元素

'''list'''
my_list.append(element) # 末尾增加

my_list.pop(index) # 根据索引删除
my_list.pop() # 如果不写index,则删除最后一个。 若为空列表会报错
del listname[start : end] # 根据索引删除
del listname[index]  # 根据索引删除

listname.remove(value) #根据元素值进行删除

listname。clear() # 清空列表


list 乱序

import random
random.shuffle(my_list) # 没有返回值,直接修改的list本身

拼接:

np.block() 
x = np.array([1,2])#注意一定得是np.array,不能直接list
y = np.array([3,4])
z = np.block([x,y])  #[1 2 3 4]
z2 = np.block([[x],[y]]) # 第一行12,第二行34
print(z2)


my_list= my_list[0:-1] # 删除最后一个, 空列表不会报错

元素转为int

x=np.zeros(16).astype(int) 

矩阵形状: shape(), reshape()

assert(a.shape == (5,1))
a = a.reshape((5,1))
v = image.reshape( image.shape[0] *image.shape[1] * image.shape[2])

增加一维

arr1 = arr[:, :, np.newaxis]

交换两轴

np.swapaxes(data,axis1,axis2)

对所有元素计算 log, exp, abs等

u=np.log() # 默认e为底
x = np.array([1, 2, 3])
print(np.exp(x))
np.abs()
v **2

最大,最小,求和,均值, 方差,标准差

np.maximum() 
np.maximum(v,0)
np.sum(A)
A.sum(axis = 0) # axis = 0 ,按列; 1按行
np.mean(arr) # 方差

np.var(arr) # 标准差
np.std(arr) # 标准差

行标准化

x_norm = np.linalg.norm(x, axis = 1, keepdims = True)
x = x/x_norm

转置

w.T

乘法

np.dot(A,B) # 矩阵乘法(点乘)
Z = np.dot(w.T,X) + b

np.multiply(x1,x2) # 逐元素相乘

np.outer(x1,x2) # outer product

逐元素相除

np.true_divide(a,b)

累加

np.cumsum(deltaCHbO)

numpy 或list 排序

a_list.sort() # 改变a_list, 没有返回值
a_list.sorted() # 不改变a_list, 有返回值
np.sort(a) # 返回a排序的结果
np.argsort(a)# 返回排序的索引
np.argsort(np.argsort(a) # 返回排名 
np.argmax(a) # 返回最大值的索引
a[np.argsort(a[:,0])]  # 按第一列排序


# 例子
 x = np.arange(100)
 np.random.shuffle(x)
 x = x[:16]
 print(x)
 print(np.sort(x))
 print(np.argsort(x))
 rank = np.argsort(np.argsort(x))
 print(rank)
'''
[71 47 34  8 64 25 51  0 79 16 94 32 39 23 86 14]
[ 0  8 14 16 23 25 32 34 39 47 51 64 71 79 86 94]
[ 7  3 15  9 13  5 11  2 12  1  6  4  0  8 14 10]
[12  9  7  1 11  5 10  0 13  3 15  6  8  4 14  2]

'''

随机抽取list元素

import random
# random.choice:随机抽取1个
selected_element = random.choice(my_list)
# random.sample:随机抽取n个
selected_elements = random.sample(my_list, selected_num)

# 也可以先打乱再按顺序抽取
random.shuffle(my_list) # 没有返回值,直接修改的list本身
selected_elements = my_list[0:n]

找到(查找)列表中满足(符合)条件的元素

a = [1,2,3,4,5,6,7,8,9]
b = [str(x) for x in a if x%2==1]
s = ‘’.join(b)
print(s)

arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr = arr[arr % 2 == 1]
结果就是13579.

找到满足条件的元素的索引

res = np.where(a > 3)[0]

  • 如果a是一维的,会返回这样的东西:
    • 第一个参数是array,第二个是dtype,
    • 比如:(array([ 2, 2, 2, …, 29, 29, 29], dtype=int64)。
    • 数据只取第一个即可。
  • 如果a是多维的,会返回一个tuple,tuple的每个元素对应一个维度,每个元素也是上面的格式
  • 如果是多维的话,可以用np.argwhere(a), 这样返回的是符合条件的索引,比如(n,3)

np.where(condition, x, y)
x:满足条件时函数的输出
y:不满足条件时的输出

2.np.where(condition)
没有x和y参数,则以元组形式输出满足条件的列表索引。

3.np.argwhere(condition)

对比两个list

wehavenot = [x for x in json_scenes if x not in our_data_scene_path_list]
    theyhavenot = [x for x in our_data_scene_path_list if x not in json_scenes]

求出不重复的元素个数

(如果是numpy,先flatten,然后转换为list,
然后转换为set,就可以求出len)

detected_targets = set(proposal_map[:,1].flatten().tolist())

关于axis:

实验如下;

print("HbData.shape: ")
print(HbData.shape)
for i in range(0,3):
print(i)
print((np.mean(HbData, axis=i)).shape)

HbData.shape:
(96, 3, 15000, 53)
0
(3, 15000, 53)
1
(96, 15000, 53)
2
(96, 3, 53)

结论:
● 会沿axis这个轴计算
● aixs标号从0开始
● 比如如果是mean,sum这种只有一个值的,这一轴就会消失

几种不同的乘法

np.dot(x1,x2)
np.outer(x1,x2)
np.multiply(x1,x2)
● 向量点乘DOT PRODUCT OF VECTORS:
○ 结果是标量。
○ 同位置的元素相乘,结果相加。
○ np.dot(x1,x2)
● 逐元素相乘ELEMENTWISE:
○ 结果是向量。
○ 相同位置的元素相乘,还放在这个位置。
○ np.multiply(x1,x2)
● 外积 OUTER PRODUCT, 张量积,
○ 结果是矩阵
○ outer[i,j] = x1[i]*x2[j]

○ np.outer(x1,x2)
● 另一个外积:Exterior Product , Cross Product, 外积:向量积,叉乘,

random

import random
# random.choice:随机抽取1个
selected_element = random.choice(my_list)
# random.sample:随机抽取n个
selected_elements = random.sample(my_list, selected_num)

# 打乱顺序
random.shuffle(my_list) # 没有返回值,直接修改的list本身

os

import os
os.path.join(path,filename) # 连接两个或多个path
os.path.exists(path) # 判断是否存在
os.listdir(path) # 列出path下所有路径或文件
os.makedirs(path) # 新建文件夹,可以有多层
os.mkdir(path) # 新建文件夹,不能有多层
os.system(command) # 运行命令,比如linux的ls命令等

例子

delta_OD_1 = np.block([np.array( [0]),np.log(np.true_divide(filtedData1[0:samplePerChannel-1] , filtedData1[1:samplePerChannel] ))])
delta_OD_2 = np.block([np.array( [0]),np.log(np.true_divide(filtedData2[0:samplePerChannel-1] , filtedData2[1:samplePerChannel] ))])
deltaCHbO = (delta_OD_2*epsilon_HbR_1*L1 - delta_OD_1 * epsilon_HbR_2 * L2)\
                             /((epsilon_HbO_2*epsilon_HbR_1 - epsilon_HbO_1 * epsilon_HbR_2)*L1*L2)
deltaCHbR = (delta_OD_2*epsilon_HbO_1*L1 - delta_OD_1 * epsilon_HbO_2 * L2)\
                             /((epsilon_HbO_1 * epsilon_HbR_2 - epsilon_HbO_2* epsilon_HbR_1)* L1*L2 )
CHbO = np.cumsum(deltaCHbO) + 0.1
CHbR = np.cumsum(deltaCHbR) + 0.1
CHbTotal = CHbO + CHbR
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 支持向量机(SVM)是一种常用的机器学习算法,广泛应用于分类和回归任务中。在手写数字识别中,我们可以使用SVM训练一个分类器,将手写数字分为不同的类别。 在Python中,有许多开源的机器学习库可以使用,如scikit-learn、TensorFlow等。这些库提供了许多SVM模型的实现,我们可以直接调用库函数实现手写数字的识别任务。 具体步骤如下: 1. 数据集准备:我们需要准备一个数据集,包含许多手写数字的图像以及它们对应的类别标签。这个数据集可以从开源资源中获得,如MNIST数据集。 2. 特征提取:将每个图像转换为数字特征向量,以便SVM算法能够进行训练。我们可以使用常用的特征提取方法,例如灰度化、二值化、HOG特征等。 3. SVM模型训练:使用scikit-learn库中的SVM分类器,将数据集的特征向量和标签输入到模型中进行训练。 4. 模型测试:使用测试集中的手写数字图像,通过模型进行预测,并与真实标签进行比较,来测试模型的准确率。 最终,我们可以通过SVM算法完成手写数字识别的任务。这种方法的优点是准确率较高且具有较好的泛化能力,可以应用于许多其他的分类任务中。同时,也可以通过调整特征提取方法和SVM模型参数来提高识别准确率。 ### 回答2: 基于支持向量机(Support Vector Machine,SVM)的手写数字识别使用Python进行实现,需要以下步骤: 1. 数据预处理:将手写数字图片转换成数字矩阵,可以使用Python中的OpenCV或PIL库来读取图片,并将RGB值转换成灰度值;接着可以使用Numpy将灰度矩阵转换为特征向量。 2. 数据切分:将预处理后的数据集分为训练集和测试集。通过切分数据集,我们可以在模型训练之前评估数据集的质量和模型性能。 3. 特征提取:使用特征提取方法,将数字矩阵转换为一组数字特征。可以考虑使用HOG方法来提取特征,或者使用其他的特征提取算法。 4. 模型训练:使用SVM算法来训练模型,并根据模型的训练误差和准确率做出相应的调整。 5. 模型评估:在测试集上进行模型评估,计算模型的精确度、召回率、F1值等性能指标,判断模型是否达到预期的识别效果。 最后,我们可以将训练好的SVM模型应用于未知的手写数字图像中,实现数字识别的功能。通过不断的优化和调整模型参数,可以提高识别准确率和效率,满足实际生产和应用的需求。 ### 回答3: 支持向量机(Support Vector Machine, SVM)是一种常见的机器学习算法,它也是许多图像识别、语音识别等领域所使用的算法之一。手写数字识别是机器学习领域中的一个经典问题,基于SVM的手写数字识别的原理也是类似。具体实现可以使用Python语言。 首先,需要准备一个手写数字数据集,这可以使用MINST数据集。将数据集用Python程序读取进来,并将其转换为向量形式,然后对向量数据进行标准化处理。 然后,使用Python中的scikit-learn库来训练一个SVM模型,此处以线性核函数为例。训练过程中,需要将数据集划分为训练集和测试集。在训练过程中调整参数,找到最优的超参数。 训练完成以后,使用测试集测试模型的准确率。针对错误分类的样本,可以通过可视化方式帮助分析算法的性能,并对算法进行优化。 最后,将模型保存下来,以便后续使用。 综上所述,基于SVM的手写数字识别Python实现,需要以下步骤:数据预处理、训练SVM模型、测试模型性能、分析结果并对模型进行优化、保存模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值