前端 、Python 扁平化嵌套数组和应用场景

在JavaScript中,如果你想要扁平化嵌套数组,你可以使用Array.prototype.flat()方法。这个方法会按照指定的深度递归遍历数组,并将所有元素连接到一个新数组中。以下是一个示例:

let nestedArray = [1, [2, [3, [4]], 5]];let flattenedArray = nestedArray.flat(Infinity); console.log(flattenedArray); // 输出:[1, 2, 3, 4, 5]

这里.flat()方法的参数是一个数值,代表提取深度。当参数为Infinity时,意味着无论任何深度的嵌套,都将被提取。

需要注意的是,Array.prototype.flat()方法在ECMAScript 2019标准中被引入,不兼容老版本浏览器。对于不支持.flat()的环境,可以使用递归配合数组的.concat()方法实现:

function flatten(arr) {let result = []; // 结果数组arr.forEach((item) => {if (Array.isArray(item)) {result = result.concat(flatten(item)); // 如果是数组,递归扁平化} else {result.push(item); // 如果不是数组,直接添加}});return result;
}let nestedArray = [1, [2, [3, [4]], 5]];let flattenedArray = flatten(nestedArray);console.log(flattenedArray);

除了使用递归,也可以利用 Array.prototype.reduce 方法和 concat 方法来扁平化数据。

这是一个例子:

function flatten(arr) {return arr.reduce((prev, curr) => {return prev.concat(Array.isArray(curr) ? flatten(curr) : curr);}, []);
}let nestedArray = [1, [2, [3, [4]], 5]];
let flattenedArray = flatten(nestedArray);
console.log(flattenedArray); // 输出: [1, 2, 3, 4, 5]

在这个例子中,reduce 方法遍历所有元素,然后返回一个包含所有单一元素的新数组。我们使用 concat 来合并原始的元素和嵌套的元素,如果当前元素是数组,我们使用递归调用 flatten。

除此之外, 对于支持 Generator 的环境,还可以使用以下方法:

function* flatten(arr) {for (const i of arr) {if (Array.isArray(i)) {yield* flatten(i);} else {yield i;}}
}let nestedArray = [1, [2, [3, [4]], 5]];
let flattenedArray = Array.from(flatten(nestedArray));
console.log(flattenedArray); // 输出: [1, 2, 3, 4, 5]

在这个例子中,我们使用 Generator 函数和 yield* 关键字来访问嵌套的遍历器。这是一个更为现代和强大的做法,但不被所有的JavaScript环境支持。

要确定一个数组是否已完全扁平化,你可以使用 Array.prototype.some 方法配合 Array.isArray。如果数组中有任何元素仍然是数组,那么这个数组就没有被完全扁平化。以下是一个相关的代码示例:

function isFlattened(arr) {return !arr.some(Array.isArray);
}let flattenedArray = [1, 2, 3, 4, 5];
console.log(isFlattened(flattenedArray)); // 输出:truelet nestedArray = [1, 2, [3, 4, 5]];
console.log(isFlattened(nestedArray)); // 输出:false

在本例中,isFlattened 函数通过检查数组中是否有某个元素仍是数组来判断该数组是否已被扁平化。Array.prototype.some 会为数组中的每个元素执行回调函数,如果回调函数对任何一个元素返回 true,则 some 方法立即返回 true,否则返回 false。使用 Array.isArray,可以确定一个指定的值是否是数组。

以下是上述应用场景中的JavaScript代码示例:

  1. 数据预处理中的扁平化操作:在处理多维数组的数据时,你可能需要使用扁平化操作。例如,如果你在进行机器学习并使用一些模型(如线性回归模型),你需要将多维度的数据转变为一维的。
let data = [[1, 2], [3, 4]];
data = data.flat();
console.log(data); // 输出:[1, 2, 3, 4]

在这个例子中,flat 函数被用来将二维数组 data 扁平化为一维数组。

  1. 使用扁平化操作来处理嵌套的数据结构。例如,在处理一组用户的数据时,你可能有一个数组,其中每个元素代表一个用户,而这个用户可能又有一个数组,代表他们的购买记录。如果你需要获得所有的购买记录,你可能需要对这个数组进行扁平化操作。
let users = [{name: 'User 1', purchases: ['Product 1', 'Product 2']},{name: 'User 2', purchases: ['Product 3', 'Product 4']},
];
let purchases = users.map(user => user.purchases).flat();
console.log(purchases); // 输出:['Product 1', 'Product 2', 'Product 3', 'Product 4']

在这个例子中,我们首先使用 map 函数来获取每个用户的购买记录(结果将是一个二维数组),然后使用 flat 函数将其扁平化为一维数组。

  1. 在处理DOM元素时,我们经常会碰到嵌套数组的情况。例如,当我们从DOM中选取符合某些条件的元素时,结果可能是嵌套的。为了更容易处理这些元素,我们会首先将其扁平化。
let nestedNodes = [document.querySelectorAll('div'), document.querySelectorAll('span')
];
let nodes = Array.prototype.concat(...nestedNodes);

在这个例子中,我们首先获取了所有的 div 和 span 元素(每个都是一个NodeList),然后使用 concat 函数将这两个NodeList合并为一个。注意,由于 querySelectorAll 返回的是一个NodeList(而不是一个数组),我们需要使用 Array.prototype.concat 函数来进行扁平化操作。

以上是JavaScript中数组扁平化的一些常见应用场景,其在数据处理和DOM操作等许多方面都有实际应用。

  1. 在数据预处理中进行扁平化操作:当你处理的数据是多维数组时,如图像数据,而你需要将其输入到某些模型(例如逻辑回归,支持向量机等)进行训练,这些模型要求输入数据是一维的。此时,你需要将多维数组扁平化成一维数组。

例如: 我们有一个二维数组,我们将其扁平化为一维数组。

   import numpy as npa = np.array([[1, 2], [3, 4]])print('Original array:')print(a)print('Flattened array:')print(a.flatten())这将输出:Original array:[[1 2][3 4]]Flattened array:[1 2 3 4]
  1. 在NumPy中的Mandelbrot图像生成中使用数组扁平化。代码如下:
   y,x = np.ogrid[ -1.4:1.4:h*1j, -2:0.8:w*1j ]c = x+y*1jz = cdivtime = maxit + np.zeros(z.shape, dtype=int)for i in range(maxit):z = z**2 + cdiverge = z*np.conj(z) > 2**2            # who is divergingdiv_now = diverge & (divtime==maxit)  # who is diverging nowdivtime[div_now] = i                  # note whenz[diverge] = 2                        # avoid diverging too much

这种场景中,使用二维数组来代表图像像素的位置与颜色。然后通过迭代更新所有像素的颜色。最后使用matplotlib的imshow函数来显示图像。

  1. 机器学习数据预处理中常用到扁平化操作,比如使用TensorFlow的Keras,在处理手写数字图像数据集时需要进行扁平化操作:
 # TensorFlow and tf.kerasimport tensorflow as tf# Helper librariesimport numpy as npimport matplotlib.pyplot as pltprint(tf.__version__)# 导入数据mnist = tf.keras.datasets.mnist(train_images, train_labels), (test_images, test_labels) = mnist.load_data()# 数据预处理train_images.shapetest_images.shapetrain_images = train_images.reshape((60000, 28 * 28))train_images = train_images.astype('float32') / 255test_images = test_images.reshape((10000, 28 * 28))test_images = test_images.astype('float32') / 255

在这个例子中,扁平化处理被用于将每个图像从一个2D数组(代表图像的像素网格)转换为一个包含784个像素值的1D数组。

注意,numpy的flatten()函数返回原数组的一个拷贝,对拷贝所做的修改不会影响原始数组,而ravel()返回的是视图,会影响原始数组。

以上只是一些简单的例子,实际上在数据处理和机器学习等许多领域,都可能会使用到数组扁平化。

以上就是文章全部内容了,如果喜欢这篇文章的话,还希望三连支持一下,感谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/23247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

揭秘银行商业汇票贴现贷款的神秘面纱

银行商业汇票贴现贷款是指银行以购买未到期商业汇票的方式向企业发放的贷款。这种贷款方式实质上是银行通过贴现,扣除了利息后向持票人融通资金的一种形式。 具体来说,当企业急需资金时,若持有银行承兑汇票或商业承兑汇票,就可以按…

Navicat+sqlite操作数据

使用navicat操作数据库(比如sqlite数据库)可以实现与access(参考该文)一样的操作,可以导入导出excel等格式的文件,如下图所示。 两种方式的sql语句的语法也基本一样。

C# PaddleOCR 单字识别效果

C# PaddleOCR 单字识别效果 效果 说明 根据《百度办公文档识别C离线SDKV1.2用户接入文档.pdf》,使用C封装DLL,C#调用。 背景 为使客户、第三方开发者等能够更快速、方便的接入使用百度办公文档识别 SDK、促进百度 OCR产品赋能更多客户,特设…

水泵选型指南

在现代暖通空调(HVAC)系统中,冷冻水泵是关键组件之一,它在提供冷却和空调效果方面起着至关重要的作用。选择合适的冷冻水泵不仅可以提高系统效率,还能节省能源和维护成本。本文将介绍冷冻水泵选型的关键因素和步骤。 …

【遗传算法】【机器学习】【Python】常见交叉方法(二)、多点交叉和均匀交叉

往期遗传算法文章见: 【遗传算法】【机器学习】【Python】常见交叉方法(一)、单点交叉和两点交叉 一、遗传算法流程图 交叉过程即存在于上图的”交叉“(crossover)步骤中。 二、多点交叉 多点交叉的原理就是&#x…

金融科技发展报告:移动支付的市场格局、趋势与优缺点

一、引言 随着科技的飞速发展,金融科技已成为推动全球经济发展的重要力量。移动支付作为金融科技的重要分支,其市场格局与趋势日益受到业界的关注。本报告将详细剖析移动支付的市场格局,并深入探讨其发展趋势,同时结合相关案例和数据,为读者呈现移动支付的优缺点,以及国…

LNMP网络架构的搭建

操作准备:准备三台虚拟机 安装 MySQL 服务 (1)准备好mysql目录上传软件压缩包并解压 cd /opt mkdir mysql tar xf mysql-boost-5.7.44.tar.gz (2)安装mysql环境依赖包 yum -y install ncurses ncurses-devel bison…

JVM之垃圾回收面试总结

文章目录 1.GC概述1.1 什么是垃圾1.2 为什么需要GC?1.3 早期垃圾回收1.4 Java垃圾回收机制1.5 评估GC的性能指标 2.垃圾回收相关算法2.1 垃圾标记阶段的算法2.1.1 引用计数算法(Java没有使用)2.1.2 可达性分析算法 2.2 垃圾清除阶段的算法2.2.1 标记-清除(Mark-Swee…

RAG 高效应用指南 :Query 理解

前言 构建一个检索增强生成 (Retrieval-Augmented Generation, RAG) 应用的 PoC(概念验证,Proof of Concept)过程相对简单,但要将其推广到生产环境中则会面临多方面的挑战。这主要是因为 RAG 系统涉及多个不同的组件,…

go语言接口之flag.Value接口

我们先看下这个会休眠特定时间的程序: var period flag.Duration("period", 1*time.Second, "sleep period")func main() {flag.Parse()fmt.Printf("Sleeping for %v...", *period)time.Sleep(*period)fmt.Println() } 在它休眠前它…

如何进行用户研究

进行用户研究是一个系统性和目标驱动的过程,旨在深入了解用户的需求、行为和期望,以便为产品设计、优化和决策提供有力的支持。以下是进行用户研究的详细步骤和方法: 确定研究目标: 在开始用户研究之前,首先需要明确研…

Termux安装SSH服务与内网穿透工具实现远程SFTP传输文件

文章目录 前言1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 前言 本教程主要介绍如何在安卓 Termux 系统中使用 SFTP 文件传输并结合[cpolar内网穿透工具](cpolar - 安全的内网穿透工具)轻松实现无公网IP远程传输,无需购…

ATFX汇市:加拿大央行或启动首次降息,关注加元贬值风险

ATFX汇市:今日21:45,加拿大央行将公布6月份利率决议结果,当前的基准利率为5%,市场普遍预期其将降息25基点,最新基准利率有可能调降至4.75%。市场人士预期降息的主要依据有两点,其一是加拿大央行行长麦克勒姆…

超级详细Spring AI运用Ollama大模型

大模型工具Ollama 官网:https://ollama.com/ Ollama是一个用于部署和运行各种开源大模型的工具; 它能够帮助用户快速在本地运行各种大模型,极大地简化了大模型在本地运行的过程。用户通过执行几条命令就能在本地运行开源大模型,如Lama 2等; 综上&#x…

PostgreSQL的内存结构

PostgreSQL的内存结构 PostgreSQL 是一个复杂而功能强大的数据库管理系统,其内存结构对于性能和稳定性至关重要。了解 PostgreSQL 的内存管理,可以帮助我们进行数据库调优和故障排查。 内存结构概述 PostgreSQL 的内存结构主要分为三部分:…

每日十题---四

1. 6.5 js 第八题 以下代码的输出结果是 1 2 3 4 var f function g() { return 23; }; typeof g(); 答: 首先声明函数有两种,一种是函数声明,一种是表达式声明。这里就是表达式声明,所以声明之后,只能使用 f(…

SpringBoot:SpringBoot中使用Redisson实现分布式锁

一、前言 Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。 刚好项目中需要使用到分布式锁,记录一下Redisson是如何使用分布式…

Day1——一些感想,学习计划和自我激励(不重要,跳过吧)

笨人刚刚接触计算机的时候,属于是两眼一抹黑。高考后玩了一整个暑假,脑子已经丢掉了,学起来很痛苦,但是也在学习过程中接触到了很多新鲜的东西,现在对于计算机的各种方向,我都很想试试(试试就逝…

(免费领源码)Java#springboot#MySQL书法社团管理系统36200-计算机毕业设计项目选题推荐

目 录 摘要 Abstract 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 书法社团管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析…

SqlServer2016企业版安装

前言 好久没有知识的累积,最近工作上遇到新的SqlServer2016安装,记录一下 参考文章 SQL Server 2016软件安装包和安装教程 - 哔哩哔哩 (bilibili.com) 安装包准备 需要提前准备软件安装包如下 cn_sql_server_2016_enterprise_x64_dvd_8699450&…