首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在不移动FALSY元素的情况下混洗数组?

在不移动FALSY值(如falsenull0""undefinedNaN)的情况下混洗数组,可以使用以下步骤:

基础概念

混洗数组通常指的是将数组中的元素随机重新排列。如果不移动FALSY值,意味着这些值在混洗后的数组中应保持其原始位置。

相关优势

  • 保持特定元素的稳定性:对于需要保持某些元素(如FALSY值)位置不变的应用场景非常有用。
  • 灵活性:可以在混洗过程中排除或保留特定类型的元素。

类型与应用场景

  • 类型:这是一种特殊的数组混洗方法,适用于需要对数组进行部分随机化的场景。
  • 应用场景:在数据分析、模拟、游戏开发等领域,有时需要保持某些关键元素的固定位置。

实现方法

以下是一个JavaScript示例代码,展示如何实现这一功能:

代码语言:txt
复制
function shuffleArrayWithFalsey(arr) {
  // 创建一个副本以避免修改原始数组
  let shuffled = arr.slice();
  
  // 获取所有非FALSY值的索引
  let indices = shuffled.map((value, index) => value ? index : null).filter(index => index !== null);
  
  // 使用Fisher-Yates算法混洗这些索引对应的元素
  for (let i = indices.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [shuffled[indices[i]], shuffled[indices[j]]] = [shuffled[indices[j]], shuffled[indices[i]]];
  }
  
  return shuffled;
}

// 示例
let arr = [1, 0, 3, false, 5, null, 7];
console.log(shuffleArrayWithFalsey(arr));

解释

  1. 创建副本:首先复制原始数组以避免直接修改它。
  2. 获取索引:通过映射函数获取所有非FALSY值的索引,并过滤掉null值。
  3. 混洗索引:使用Fisher-Yates算法对这些索引进行混洗,从而间接地混洗数组中的非FALSY值。

遇到的问题及解决方法

  • 性能问题:如果数组非常大,上述方法可能会影响性能。可以通过分批处理或优化算法来解决。
  • 复杂性问题:对于复杂的数组结构,可能需要更复杂的逻辑来确保FALSY值的稳定性。

通过这种方法,可以在保持FALSY值位置不变的同时,有效地混洗数组中的其他元素。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Pyspark学习笔记(四)弹性分布式数据集 RDD(上)

④.分区 当从数据创建 RDD 时,它默认对 RDD 中的元素进行分区。默认情况下,它会根据可用内核数进行分区。...; 第一:使用repartition(numPartitions)从所有节点混洗数据的方法,也称为完全混洗, repartition()方法是一项非常昂贵的操作,因为它会从集群中的所有节点打乱数据。...第二:使用coalesce(n)方法**从最小节点混洗数据,仅用于减少分区数**。 这是repartition()使用合并降低跨分区数据移动的优化或改进版本。...8、混洗操作 Shuffle 是 PySpark 用来在不同执行器甚至跨机器重新分配数据的机制。...PySpark Shuffle 是一项昂贵的操作,因为它涉及以下内容 ·磁盘输入/输出 ·涉及数据序列化和反序列化 ·网络输入/输出 混洗分区大小和性能 根据数据集大小,较多的内核和内存混洗可能有益或有害我们的任务

3.9K10
  • Adaptive and Robust Query Execution for Lakehouses at Scale(翻译)

    在执行过程中,可能会出现一种情况,起初计划为混洗哈希连接的连接,由于估计表明双方都太大,但实际执行时可能发现一侧足够小以进行广播。在这种情况下,AQE介入以动态改变执行计划,将其转换为广播哈希连接。...在这种情况下,AQE重新规划可以将其切换为混洗哈希连接,通过避免将大型构建侧发送到所有执行器并加载到内存中,也能提升查询性能。...5.4 物理重写(弹性混洗并行度)分布式查询引擎中,确定混洗分区的数量是一个重大挑战。一些系统从固定的混洗并行度开始,而其他系统则依赖于复杂的启发式方法。...虽然在生产环境中稳定性问题并不常见,但能够在不导致查询失败或系统崩溃的情况下实现优雅降级对于企业产品至关重要。...6.2 规划器规则混洗消除回退 类似于SCOPE[47]中的混洗消除优化,我们的静态优化器也进行基于成本的混洗消除。在大多数情况下,较少的混洗往往会使查询运行得更快。

    12010

    卷积神经网络学习路线(十九) | 旷世科技 2017 ShuffleNetV1

    这篇论文提出的ShuffleNet基于探索一个可以满足受限条件的高效基础网络架构。论文发现先进的架构如Xception和ResNetXt在小型网络模型中效率较低,因为大量的1*1卷积耗费了大量时间。...方法 针对组卷积的通道混洗 现代卷积神经网络会包含多个重复模块。...具体实现的话,我们就可以对于上一层输出的通道做一个混洗操作,如下图c所示,再分为几个组,和下一层相连。 ?...通道Shuffle操作是可微的,模型可以保持end-to-end训练。 混洗单元 在实际过程中,我们构建了一个ShuffleNet Unit(混洗单元),便于后面组合为网络模型。 ?...有通道混洗和没有通道混洗 Shuffle操作是为了实现多个组之间信息交流,下表表现了有无Shuffle操作的性能差异: ?

    1K20

    为什么MobileNet及其变体如此之快?

    选自Medium 作者:Yusuke Uchida 机器之心编译 参与:Nurhachu Null、王淑婷 在本文中,作者对高效 CNN 模型(如 MobileNet 及其变体)中常用的组成模块进行了概述...通道混洗(Channel shuffle) 通道混洗是改变 ShuffleNet[5] 中所用通道顺序的操作(层)。这种操作是通过张量整形和转置来实现的。...这里,G 代表的是分组卷积中分组的数目,分组卷积通常与 ShuffleNet 中的通道混洗一起使用。 虽然不能用乘-加运算次数(MACs)来定义通道混洗的计算成本,但是这些计算应该是需要一些开销的。...G=2 的通道混洗的例子。没有进行卷积,只改变了通道顺序。 ? G=3 的通道混洗的例子。...这里的重要组成模块是通道混洗层,它「混洗」了分组卷积中的通道顺序。如果没有通道混洗,分组卷积的输出就无法在分组中利用,这会导致准确率的降低。

    93320

    JS 中为啥 .map(parseInt) 返回

    falsy(虚值)是在 Boolean 上下文中已认定可转换为‘假‘的值。 JS中的对象不是真值就是虚值。 令人困惑的是,这意味着字符串“false”,字符串“0”,空对象{}和空数组[]都是真的。...使用使用 Boolean 方法来验证,如 Boolean("0")。 出于我们的目的,接下来只要记住0是假的就行了。...,它是一个高阶函数,通过传入一个函数进行逻辑操作,并返回一个数组, 例如,以下代码将数组中的每个元素乘以3: function multiplyBy3(x) { return x * 3; }...5].map(multiplyBy3); console.log(result); // logs [3, 6, 9, 12, 15]; 现在,将console.log作为参数传给 map,来打印数组的元素...如果提供的基数是虚值,则默认情况下,基数设置为10。

    4.7K30

    【Spark】Spark之how

    转换 - Value – 多RDD (1) union:生成一个包含两个RDD中所有元素的RDD。不会去重,不进行混洗。 (2) intersection:求两个RDD共同的元素的RDD。...会去掉所有重复元素(包含单集合内的原来的重复元素),进行混洗。 (3) subtract:返回一个由只存在于第一个RDD中而不存在于第二个RDD中的所有元素组成的RDD。不会去除重复元素,需要混洗。...从HDFS上读取输入RDD会为数据在HDFS上的每个文件区块创建一个分区。从数据混洗后的RDD派生下来的RDD则会采用与其父RDD相同的并行度。...Spark提供了两种方法对操作的并行度进行调优: (1) 在数据混洗操作时,使用参数的方式为混洗后的RDD指定并行度; (2) 对于任何已有的RDD,可以进行重新分区来获取更多或者更少的分区数。...序列化调优 序列化在数据混洗时发生,此时有可能需要通过网络传输大量的数据。默认使用Java内建的序列化库。Spark也会使用第三方序列化库:Kryo。

    94120

    数据结构快速盘点 - 线性结构

    需要注意的是,线性和非线性不代表存储结构是线性的还是非线性的,这两者没有任何关系,它只是一种逻辑上的划分。比如我们可以用数组去存储二叉树。 一般而言,有前驱和后继的就是线性数据结构。...在计算机科学中, 一个 栈(stack) 是一种抽象数据类型,用作表示元素的集合,具有两种主要操作: push, 添加元素到栈的顶端(末尾); pop, 移除栈最顶端(末尾)的元素....此外,应有一个 peek 操作用于访问栈当前顶端(末尾)的元素。(只返回不弹出) "栈"这个名称,可类比于一组物体的堆叠(一摞书,一摞盘子之类的)。...社区中有很多“执行上下文中的scope指的是执行栈中父级声明的变量”说法,这是完全错误的, JS是词法作用域,scope指的是函数定义时候的父级,和执行没关系 栈常见的应用有进制转换,括号匹配,栈混洗...合法的栈混洗操作,其实和合法的括号匹配表达式之间存在着一一对应的关系, 也就是说n个元素的栈混洗有多少种,n对括号的合法表达式就有多少种。

    93250

    Pyspark学习笔记(五)RDD的操作

    由于RDD本质上是不可变的,转换操作总是创建一个或多个新的RDD而不更新现有的RDD,因此,一系列RDD转换创建了一个RDD谱系(依赖图)。...1.窄操作     这些计算数据存在于单个分区上,这意味着分区之间不会有任何数据移动。...由于这些对数据进行混洗,因此它们也称为混洗转换,所以与窄操作相比,是更加昂贵的操作。...(n) 返回RDD的前n个元素(无特定顺序)(仅当预期结果数组较小时才应使用此方法,因为所有数据都已加载到驱动程序的内存中) takeOrdered(n, key) 从一个按照升序排列的RDD,或者按照...key中提供的方法升序排列的RDD, 返回前n个元素(仅当预期结果数组较小时才应使用此方法,因为所有数据都已加载到驱动程序的内存中) https://spark.apache.org/docs/2.2.1

    4.4K20

    Pyspark学习笔记(四)---弹性分布式数据集 RDD (上)

    在Pyspark中,RDD是由分布在各节点上的python对象组成,如列表,元组,字典等。...#使用textFile()读取目录下的所有文件时,每个文件的每一行成为了一条单独的记录, #而该行属于哪个文件是不记录的。...粗粒度转化操作:把函数作用于数据的每一个元素(无差别覆盖),比如map,filter 细粒度转化操作:可以针对单条记录或单元格进行操作。...RDD ③不需要进行节点间的数据混洗 宽操作: ①通常需要数据混洗 ②RDD有多个依赖,比如在join或者union的时候 7.RDD容错性 因为每个RDD的谱系都被记录,所以一个节点崩溃时,任何RDD...: 由双精度浮点数组成的RDD。

    2K20

    数据结构与算法 - 线性结构

    需要注意的是,线性和非线性不代表存储结构是线性的还是非线性的,这两者没有任何关系,它只是一种逻辑上的划分。比如我们可以用数组去存储二叉树。 一般而言,有前驱和后继的就是线性数据结构。...在计算机科学中, 一个 栈(stack) 是一种抽象数据类型,用作表示元素的集合,具有两种主要操作: push, 添加元素到栈的顶端(末尾); pop, 移除栈最顶端(末尾)的元素....此外,应有一个 peek 操作用于访问栈当前顶端(末尾)的元素。(只返回不弹出) "栈"这个名称,可类比于一组物体的堆叠(一摞书,一摞盘子之类的)。...社区中有很多“执行上下文中的scope指的是执行栈中父级声明的变量”说法,这是完全错误的, JS是词法作用域,scope指的是函数定义时候的父级,和执行没关系 栈常见的应用有进制转换,括号匹配,栈混洗...合法的栈混洗操作,其实和合法的括号匹配表达式之间存在着一一对应的关系, 也就是说n个元素的栈混洗有多少种,n对括号的合法表达式就有多少种。

    73920

    Pyspark学习笔记(四)弹性分布式数据集 RDD 综述(上)

    ; 第一:使用repartition(numPartitions)从所有节点混洗数据的方法,也称为完全混洗, repartition()方法是一项非常昂贵的操作,因为它会从集群中的所有节点打乱数据。...第二:使用coalesce(n)方法**从最小节点混洗数据,仅用于减少分区数**。 这是repartition()使用合并降低跨分区数据移动的优化或改进版本。...()方法读取的内容就是以键值对的形式存在 DoubleRDD: 由双精度浮点数组成的RDD。...8、混洗操作 Shuffle 是 PySpark 用来在不同执行器甚至跨机器重新分配数据的机制。...PySpark Shuffle 是一项昂贵的操作,因为它涉及以下内容 ·磁盘输入/输出 ·涉及数据序列化和反序列化 ·网络输入/输出 混洗分区大小和性能 根据数据集大小,较多的内核和内存混洗可能有益或有害我们的任务

    3.9K30

    读书 | Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    如果不设置该值,Mesos可能会使用急群众所有可用的核心。 选择合适的集群管理器: 1.一般情况下,可以直接选择独立集群模式,功能全,而且简单。...当RDD不需要混洗数据就可以从父节点计算出来,RDD不需要混洗数据就可以从父节点计算出来,或把多个RDD合并到一个步骤中时,调度器就会自动进行进行"流水线执行"(pipeline)。...调优方法 在数据混洗操作时,对混洗后的RDD设定参数制定并行度 对于任何已有的RDD进行重新分区来获取更多/更少的分区数。...数据混洗与聚合的缓存区(20%) 当数据进行数据混洗时,Spark会创造一些中间缓存区来存储数据混洗的输出数据。...用户的代码(20%) spark可以执行任意代码,所以用户的代码可以申请大量内存,它可以访问JVM堆空间中除了分配给RDD存储和数据混洗存储以外的全部空间。20%是默认情况下的分配比例。

    1.2K60

    万字长文带你看尽深度学习中的各种卷积网络

    本质上是在不增加额外的计算成本的情况下观察感受野。 在图像中,3 x 3 的红点表明经过卷积后的输出图像的像素是 3 x 3。...ShuffleNet 是一种计算高效的卷积架构,专为计算能力十分有限的移动设备(如 10–150 MFLOPs)设计。...总的来说,混洗分组卷积包括分组卷积和通道混洗(channel shuffling)。...通道混洗的思路就是混合来自不同过滤器组的信息。下图中,显示了应用有 3 个过滤器组的第一个分组卷积 GConv1 后所得到的特征映射。...在将这些特征映射喂养到第二个分组卷积之前,先将每个组中的通道拆分为几个小组,然后再混合这些小组。 ? 通道混洗 经过这种混洗,我们再接着如常执行第二个分组卷积 GConv2。

    66710

    万字长文带你看尽深度学习中的各种卷积网络

    本质上是在不增加额外的计算成本的情况下观察感受野。 在图像中,3 x 3 的红点表明经过卷积后的输出图像的像素是 3 x 3。...ShuffleNet 是一种计算高效的卷积架构,专为计算能力十分有限的移动设备(如 10–150 MFLOPs)设计。...总的来说,混洗分组卷积包括分组卷积和通道混洗(channel shuffling)。...通道混洗的思路就是混合来自不同过滤器组的信息。下图中,显示了应用有 3 个过滤器组的第一个分组卷积 GConv1 后所得到的特征映射。...在将这些特征映射喂养到第二个分组卷积之前,先将每个组中的通道拆分为几个小组,然后再混合这些小组。 ? 通道混洗 经过这种混洗,我们再接着如常执行第二个分组卷积 GConv2。

    81230
    领券