龙空技术网

Scala的小总结和计算信息熵

技术信仰 170

前言:

目前咱们对“featvecpython”大体比较关切,姐妹们都想要分析一些“featvecpython”的相关内容。那么小编也在网上网罗了一些关于“featvecpython””的相关内容,希望朋友们能喜欢,你们一起来了解一下吧!

在工作中,我通常使用pyspark和Java调用spark进行数据处理。考虑到python的性能和java代码的繁复性,以及公司特有的jar包没有python版本,便开始使用scala进行大数据处理。下面是我在使用过程中的一些基础属性总结,最后,综合所有小知识点,给出了一个信息熵的scala版本计算函数。


Array、ArrayBuffer与List

Array数组提供下标高效访问(获取或更新)指定位置的元素值。

内容:不可变大小:不可变

ArrayBuffer可变数组跟Array很像,除了可以额外地从序列头部或尾部添加或移除元素。所有的Array操作在ArrayBuffer都可用。不过由于实现的包装,会稍慢一些。

内容:可变大小:可变

新建一个可变数据


import scala.collection.mutable.ArrayBufferval locations = ArrayBuffer[String]()

使用toList、toArray相互转换:


scala> Array(1,2,3).toListres14: List[Int] = List(1, 2, 3)scala> List(1,2,3).toArrayres15: Array[Int] = Array(1, 2, 3)​


List

List元素不能通过赋值改变。为后进先出做了优化,支持用::在模式匹配中取出head和tail,即支持在头部快速添加和移除条目。但是不提供快速按下标访问的功能,这个功能需要线性遍历列。

内容:不可变大小:不可变

代码示例:


val list = List(1, 2, 3, "beijing")// 在列表的最后追加val newList = list :+ 6// 在列表的头追加val newList02 = 6 +: listval list = List(1,2,3)// :: 用于的是向队列的头部追加数据,产生新的列表, x::list,x就会添加到list的头部println(4 :: list) //输出: List(4, 1, 2, 3)// .:: 这个是list的一个方法;作用和上面的一样,把元素添加到头部位置; list.::(x);println( list.:: (5))//输出: List(5, 1, 2, 3)// :+ 用于在list尾部追加元素; list :+ x;println(list :+ 6) //输出: List(1, 2, 3, 6)// +: 用于在list的头部添加元素;val list2 = "A"+:"B"+:Nil //Nil Nil是一个空的List,定义为List[Nothing]println(list2)//输出: List(A, B)// ::: 用于连接两个List类型的集合 list ::: list2println(list ::: list2) //输出: List(1, 2, 3, A, B)// ++ 用于连接两个集合,list ++ list2println(list ++ list2) //输出: List(1, 2, 3, A, B)


​tuple元组

当你定义一个函数,想返回不同类型值时,可以使用元组。val t = (1,23,"we are")通过下列方式提取元组的值:val (data_1,data_2,data_3) = t


map字典

新建一个可变字典


import scala.collection.mutableval labelCounts: mutable.Map[String, Int] = mutable.Map()

遍历字典的几种方式


// 遍历 map 的 key 和 valuefor ((key, value) <- b) { println("key is" + key + " ,value is" + value)}//遍历 map 的 key 和 valuefor (x <- map1){ println(x._1 + "->" + x._2)}// 遍历 map 的 keyfor (ele <- b.keySet) { println("key is " + ele + " ,value is" + b.getOrElse(ele, 0))}// 遍历 map 的 valuefor (ele <- b.values) { println("value is " + ele)}// 生成新 map ,反转 key 和 valuefor ((key, value) <- b) { yield (value, key)}

计算信息熵,传入一个数组和数组长度即可计算。


def CacShannonEnt(dataList: Array[String], numEntries: Int): String = {  val labelCounts: mutable.Map[String, Int] = mutable.Map()  for (featVec <- dataList) {    if (!labelCounts.contains(featVec)) {      labelCounts.put(featVec, 0)    }    labelCounts.put(featVec, labelCounts(featVec) + 1)  }  var shannonEnt = 0.0for (value <- labelCounts.values) {    val prob = value.toDouble / numEntries    shannonEnt -= prob * (Math.log(prob) / Math.log(2))  }  shannonEnt.formatted("%.4f")}

标签: #featvecpython