Breeze Linalg:如何高效将SparseVector所有值映射为常量
生成指定常量值的Breeze SparseVector
嗨,这事儿其实很简单,Breeze的SparseVector构造本身就支持直接复用原向量的结构来生成新向量,分两种常见场景给你说明:
场景1:保留原向量的非零索引结构,替换为指定常量
如果你想保持原稀疏向量里那些非零位置的索引不变,只是把值统一换成你要的常量(比如1),可以直接复用原向量的indices和length,然后生成对应长度的常量数组作为新的data:
import breeze.linalg.SparseVector // 假设你的原稀疏向量是这样的 val originalSparseVec = SparseVector(2.5, 0.0, 4.2, 0.0, 7.8) // 指定你要的常量,比如1.0 val targetConstant = 1.0 // 生成新的SparseVector val constantSparseVec = SparseVector( length = originalSparseVec.length, indices = originalSparseVec.indices, data = Array.fill(originalSparseVec.indices.length)(targetConstant) )
或者用更简洁的写法:
val constantSparseVec = SparseVector(originalSparseVec.length)( originalSparseVec.indices.map(_ => targetConstant): _* )
场景2:生成与原向量长度相同、所有位置都是常量的SparseVector
如果你想要的是整个向量的每一个位置(包括原向量的零值位置)都设为常量,那只需要生成全范围的索引数组,再搭配常量数组即可:
val fullConstantVec = SparseVector( length = originalSparseVec.length, indices = (0 until originalSparseVec.length).toArray, data = Array.fill(originalSparseVec.length)(targetConstant) )
⚠️ 注意:如果你的向量长度很大,这种全元素的稀疏向量其实和密集向量(DenseVector)的空间效率差不多,甚至更低,这种情况下直接用DenseVector.fill(originalSparseVec.length)(targetConstant)会更合适。
内容的提问来源于stack exchange,提问作者Daniil Andreyevich Baunov
相关产品推荐
相关产品推荐

