精华内容
下载资源
问答
  • 我需要在满足条件的1d NumPy数组或Pandas数值系列中找到第一个值的索引.数组很大,索引可能在数组的开始或结尾附近,或者可能根本不满足条件.我无法提前告诉您哪种可能性更大.如果不满足条件,则返回值应为-1.我考虑了...

    我需要在满足条件的1d NumPy数组或Pandas数值系列中找到第一个值的索引.数组很大,索引可能在数组的开始或结尾附近,或者可能根本不满足条件.我无法提前告诉您哪种可能性更大.如果不满足条件,则返回值应为-1.我考虑了几种方法.

    尝试1

    # func(arr) returns a Boolean array

    idx = next(iter(np.where(func(arr))[0]), -1)

    但这通常太慢,因为func(arr)在整个数组上应用矢量化函数,而不是在满足条件时停止.具体来说,在数组开始附近满足条件时,这很昂贵.

    尝试2

    np.argmax的速度稍快一些,但无法确定何时从不满足条件:

    np.random.seed(0)

    arr = np.random.rand(10**7)

    assert next(iter(np.where(arr > 0.999999)[0]), -1) == np.argmax(arr > 0.999999)

    %timeit next(iter(np.where(arr > 0.999999)[0]), -1) # 21.2 ms

    %timeit np.argmax(arr > 0.999999) # 17.7 ms

    np.argmax(arr> 1.0)返回0,即不满足条件的实例.

    尝试3

    # func(arr) returns a Boolean scalar

    idx = next((idx for idx, val in enumerate(arr) if func(arr)), -1)

    但这在数组末尾附近满足条件时太慢了.大概是因为生成器表达式具有来自大量__next__调用的昂贵开销.

    这是否总是一种折衷方案?对于通用函数,有没有办法有效地提取第一个索引?

    标杆管理

    对于基准测试,假设func在值大于给定常量时找到索引:

    # Python 3.6.5, NumPy 1.14.3, Numba 0.38.0

    import numpy as np

    np.random.seed(0)

    arr = np.random.rand(10**7)

    m = 0.9

    n = 0.999999

    # Start of array benchmark

    %timeit next(iter(np.where(arr > m)[0]), -1) # 43.5 ms

    %timeit next((idx for idx, val in enumerate(arr) if val > m), -1) # 2.5 µs

    # End of array benchmark

    %timeit next(iter(np.where(arr > n)[0]), -1) # 21.4 ms

    %timeit next((idx for idx, val in enumerate(arr) if val > n), -1) # 39.2 ms

    解决方法:

    麻巴

    使用numba可以优化两种情况.从语法上讲,您只需要构造一个带有简单for循环的函数:

    from numba import njit

    @njit

    def get_first_index_nb(A, k):

    for i in range(len(A)):

    if A[i] > k:

    return i

    return -1

    idx = get_first_index_nb(A, 0.9)

    Numba通过JIT(“及时”)编译代码并利用CPU-level optimisations来提高性能.不带@njit装饰器的常规for循环通常比您在条件较晚满足的情况下尝试过的方法要慢.

    对于熊猫数字系列df [‘data’],您可以将NumPy表示形式简单地馈送到JIT编译的函数中:

    idx = get_first_index_nb(df['data'].values, 0.9)

    概括

    由于numba允许functions as arguments,并且假设传递的函数也可以JIT编译,则可以找到一种方法,该方法可以计算第n个索引,其中满足任意函数的条件.

    @njit

    def get_nth_index_count(A, func, count):

    c = 0

    for i in range(len(A)):

    if func(A[i]):

    c += 1

    if c == count:

    return i

    return -1

    @njit

    def func(val):

    return val > 0.9

    # get index of 3rd value where func evaluates to True

    idx = get_nth_index_count(arr, func, 3)

    对于倒数第3个值,您可以输入相反的值arr [::-1],并取反len(arr)-1的结果,而-1是解决0索引所必需的.

    绩效基准

    # Python 3.6.5, NumPy 1.14.3, Numba 0.38.0

    np.random.seed(0)

    arr = np.random.rand(10**7)

    m = 0.9

    n = 0.999999

    @njit

    def get_first_index_nb(A, k):

    for i in range(len(A)):

    if A[i] > k:

    return i

    return -1

    def get_first_index_np(A, k):

    for i in range(len(A)):

    if A[i] > k:

    return i

    return -1

    %timeit get_first_index_nb(arr, m) # 375 ns

    %timeit get_first_index_np(arr, m) # 2.71 µs

    %timeit next(iter(np.where(arr > m)[0]), -1) # 43.5 ms

    %timeit next((idx for idx, val in enumerate(arr) if val > m), -1) # 2.5 µs

    %timeit get_first_index_nb(arr, n) # 204 µs

    %timeit get_first_index_np(arr, n) # 44.8 ms

    %timeit next(iter(np.where(arr > n)[0]), -1) # 21.4 ms

    %timeit next((idx for idx, val in enumerate(arr) if val > n), -1) # 39.2 ms

    标签:performance,pandas,arrays,python,numpy

    来源: https://codeday.me/bug/20191024/1924444.html

    展开全文
  • filter根据过滤条件返回符合条件的数组;过滤条件:return 后面的内容

    定义和用法

    filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。

    注意: filter() 不会对空数组进行检测。

    注意: filter() 不会改变原始数组。

    语法

    array.filter(function(currentValue,index,arr), thisValue)

    参数说明

    参数描述
    function(currentValue, index,arr)必须。函数,数组中的每个元素都会执行这个函数
    函数参数:
    参数描述
    currentValue必须。当前元素的值
    index可选。当前元素的索引值
    arr可选。当前元素属于的数组对象
    thisValue可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。
    如果省略了 thisValue ,"this" 的值为 "undefined"

     

    返回值

    返回数组,包含了符合条件的所有元素。如果没有符合条件的元素则返回空数组。

     实例

    展开全文
  • js遍历删除数组中不符合条件的元素

    千次阅读 2020-06-22 14:36:41
    // 5.725ms 10.find find()方法返回数组中符合测试函数条件的第一个元素。否则返回undefined var stu = [ { name: '张三', gender: '男', age: 20 }, { name: '王小毛', gender: '男', age: 20 }, { name: '李四', ...

    使用for循环

    let arr = [{name:"lisa"},{name:"linda"},{name:"cindy"}...]
    for(let i=0; i<arr.length; i++){
        if(arr[i]==2){
            arr.splice(i, 1);
            i--;
        }
    }
    

    使用forEach循环

    data.result.forEach((item, index, array) => {
              if (array[index].name === "lisa") {
                item = array.splice(index, 1);
              }
            });
    

    总结遍历数组的方法

    1.for循环
    使用临时变量,将长度缓存起来,避免重复获取数组长度,当数组较大时优化效果才会比较明显。

    for(j = 0,len=arr.length; j < len; j++) {
        
    }
    

    2.foreach循环

    遍历数组中的每一项,没有返回值,对原数组没有影响,不支持IE

    //1 没有返回值
    arr.forEach((item,index,array)=>{
        //执行代码
    })
    //参数:item数组中的当前项, index当前项的索引, array原始数组;
    //数组中有几项,那么传递进去的匿名回调函数就需要执行几次;
    

    3.map循环

    有返回值,可以return出来

    map的回调函数中支持return返回值;return的是啥,相当于把数组中的这一项变为啥(并不影响原来的数组,只是相当于把原数组克隆一份,把克隆的这一份的数组中的对应项改变了);

    arr.map(function(value,index,array){
     
      //do something
     
      return XXX
     
    })
    var ary = [12,23,24,42,1]; 
    var res = ary.map(function (item,index,ary ) { 
        return item*10; 
    }) 
    console.log(res);//-->[120,230,240,420,10];  原数组拷贝了一份,并进行了修改
    console.log(ary);//-->[12,23,24,42,1];  原数组并未发生变化
    

    4.forof遍历

    可以正确响应break、continue和return语句

    for (var value of myArray) {
    console.log(value);
    }
    

    5.filter遍历

    不会改变原始数组,返回新数组

    var arr = [
      { id: 1, text: 'aa', done: true },
      { id: 2, text: 'bb', done: false }
    ]
    console.log(arr.filter(item => item.done))
    

    6.every遍历

    every()是对数组中的每一项运行给定函数,如果该函数对每一项返回true,则返回true。

    var arr = [ 1, 2, 3, 4, 5, 6 ]; 
    console.log( arr.every( function( item, index, array ){ 
            return item > 3; 
        })); 
    false
    

    7.some遍历

    some()是对数组中每一项运行指定函数,如果该函数对任一项返回true,则返回true。

    var arr = [ 1, 2, 3, 4, 5, 6 ]; 
       
        console.log( arr.some( function( item, index, array ){ 
            return item > 3; 
        })); 
    true
    

    8.reduce

    reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值。

    var total = [0,1,2,3,4].reduce((a, b)=>a + b); //10
    reduce接受一个函数,函数有四个参数,分别是:上一次的值,当前值,当前值的索引,数组
    [0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array){
     return previousValue + currentValue;
    });
    

    在这里插入图片描述
    reduce还有第二个参数,我们可以把这个参数作为第一次调用callback时的第一个参数,上面这个例子因为没有第二个参数,所以直接从数组的第二项开始,如果我们给了第二个参数为5,那么结果就是这样的:

    [0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array){
     return previousValue + currentValue;
    },5);
    

    在这里插入图片描述第一次调用的previousValue的值就用传入的第二个参数代替

    9.reduceRight

    reduceRight()方法的功能和reduce()功能是一样的,不同的是reduceRight()从数组的末尾向前将数组中的数组项做累加。

    reduceRight()首次调用回调函数callbackfn时,prevValue 和 curValue 可以是两个值之一。如果调用 reduceRight() 时提供了 initialValue 参数,则 prevValue 等于 initialValue,curValue 等于数组中的最后一个值。如果没有提供 initialValue 参数,则 prevValue 等于数组最后一个值, curValue 等于数组中倒数第二个值。

    var arr = [0,1,2,3,4];
     
    arr.reduceRight(function (preValue,curValue,index,array) {
        return preValue + curValue;
    

    回调将会被调用四次,每次调用的参数及返回值如下:
    在这里插入图片描述
    如果提供一个初始值initialValue为5:

    var arr = [0,1,2,3,4];
     
    arr.reduceRight(function (preValue,curValue,index,array) {
        return preValue + curValue;
    }, 5); // 15
    

    在这里插入图片描述
    同样的,可以对一个数组求和,也可以使用reduceRight()方法:

    var arr = [1,2,3,4,5,6];
     
    console.time("ruduceRight");
    Array.prototype.ruduceRightSum = function (){
        for (var i = 0; i < 10000; i++) {
            return  this.reduceRight (function (preValue, curValue) {
                return preValue + curValue;
            });
        }
    }
    arr.ruduceRightSum();
    console.log('最终的值:' + arr.ruduceSum()); // 21
    console.timeEnd("ruduceRight"); // 5.725ms
    

    10.find

    find()方法返回数组中符合测试函数条件的第一个元素。否则返回undefined

    var stu = [
        {
            name: '张三',
            gender: '男',
            age: 20
        },
        {
            name: '王小毛',
            gender: '男',
            age: 20
        },
        {
            name: '李四',
            gender: '男',
            age: 20
        }
    ]
    function getStu(element){
       return element.name == '李四'
    }
     
    stu.find(getStu)
    //返回结果为
    //{name: "李四", gender: "男", age: 20}
    

    11.findIndex

    对于数组中的每个元素,findIndex 方法都会调用一次回调函数(采用升序索引顺序),直到有元素返回 true。只要有一个元素返回 true,findIndex 立即返回该返回 true 的元素的索引值。如果数组中没有任何元素返回 true,则 findIndex 返回 -1。

    findIndex 不会改变数组对象。

    const nameArr=[
            {id:1,userName:"zhaoqian",age:27},
            {id:2,userName:"sunli",age:23},
            {id:3,userName:"zhouwu",age:25 },
            {id:4,userName:"zhengwang",age:21}];
        /*满足条件,返回下标位置2*/
        var i1=nameArr.findIndex((value)=>value.age==25);
        console.log(i1);
    

    12.keys,values,entries

    ES6 提供三个新的方法 —— entries(),keys()和values() —— 用于遍历数组。它们都返回一个遍历器对象,可以用for…of循环进行遍历,唯一的区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历

     for (let index of ['a', 'b'].keys()) {
    console.log(index);
    }
    // 0
    // 1
    for (let elem of ['a', 'b'].values()) {
    console.log(elem);
    }
    // 'a'
    // 'b'
    for (let [index, elem] of ['a', 'b'].entries()) {
    console.log(index, elem);
    }
    // 0 "a"
    // 1 "b"
    
    展开全文
  • find()方法返回通过测试(函数内判断)的数组的第一个元素的值。当数组中的元素测试条件时返回 true 时, find()返回符合条件的元素,之后的值不会再调用执行函数。如果没有符合条件的元素返回undefined。Array.find...

    find()方法返回通过测试(函数内判断)的数组的第一个元素的值。当数组中的元素在测试条件时返回 true 时, find()返回符合条件的元素,之后的值不会再调用执行函数。如果没有符合条件的元素返回undefined。

    Array.find()方法:

    注意: find() 对于空数组,函数是不会执行的。

    注意: find() 并没有改变数组的原始值。

    语法:array.find(function(currentValue, index, arr),thisValue)

    参数:

    1、function(currentValue, index,arr):

    数组每个元素需要执行的函数。

    函数参数:

    currentValue    必需。当前元素

    index    可选。当前元素的索引值

    arr    可选。当前元素所属的数组对象

    2、thisValue

    传递给函数的值一般用 "this" 值。

    如果这个参数为空, "undefined" 会传递给 "this" 值

    返回值:

    返回符合测试条件的第一个数组元素值,如果没有符合条件的则返回undefined。

    实例:html>

    点击按钮返回符合大于输入框中指定数字的数组元素。

    最小年龄: 

    点我

    值: 

    注意: IE 11 及更早版本不支持 findIndex() 方法。

    var ages = [4, 12, 16, 20];

    function checkAdult(age) {

    return age >= document.getElementById("ageToCheck").value;

    }

    function myFunction() {

    document.getElementById("demo").innerHTML = ages.find(checkAdult);

    }

    运行下试试吧!!!

    展开全文
  • JS 数组函数汇总

    2020-08-01 19:51:31
    Array对象方法 concat() 连接两个或多个数组,返回一...从数组的指定位置拷贝元素数组的另一个指定位置中。 复制第二和第三个元素到第五和第六个位置上: var arr=["a","b","c","d","e","f","g"]; console.log(arr.co
  • 来源 | https://www.fly63.com前言有时候我们想以某种条件来查找一个数组中是否有满足改条件的元素,然后返回该元素,或者该元素索引值。JavaScript 给我们提供了...
  • 数组中的元素测试条件时返回true时,findIndex()返回符合条件的元素索引位置,之后的值就不会再调用执行函数。 如果没有符合条件的元素就返回-1。 注意: findIndex()对于空数组函数是不会执行的。 find...
  • js中数组的高级函数

    2019-08-18 16:39:40
    高阶函数 定义:如果一个函数,它的参数列表中有本身就是函数的参数,它就是一个高级函数 那依照这种定义,我们可以定义并使用一个高阶函数: function niceAdd(x, y, f) {f(x) + f(y);} var val = niceAdd(5, -...
  • 文章目录前言一、数组方法1. map();2. find()3. findIndex()4. reduce()5. filter()6. forEach()7. some() 和 every() 前言 前端开发时,经常用到很多对数组操作的高阶函数。现在特来总结一下,总结时也借鉴了不少...
  • JavaScript 专题(九)数组中查找指定元素

    万次阅读 多人点赞 2020-11-12 18:05:23
    上一篇文章中,我们了解了数组扁平化的思想,并学习了 lodash 是如何处理数组扁平化的。 这次我们来讨论**在数组中查找元素**时所用的一些方法,并且参考lodash来实现我们自己的工具方法
  • 前言有时候我们想以某种条件来查找一个数组中是否有满足改条件的元素,然后返回该元素,或者该元素索引值。Javascript 给我们提供了多种方法,主要分为按值查找和某种条件查找,下面开始介绍这些方法????。1. ...
  • some会遍历数组中的每个元素,让每个值都执行一遍callback函数 如果有一个元素满足条件,返回true , 剩余的元素不会再执行检测。 如果没有满足条件的元素,则返回false。 注意: some() 不会对空数组进行检测。 ...
  • 该长度比数组中定义的最高元素高1号。 length:number; 返回数组的字符串表示形式。 toString():string; 返回数组的字符串表示形式。元素使用它们的toLocalString方法转换为字符串。 toLocaleString():...
  • 例如,如果我有一个数组,[1, 3, 2, 4, 5]和function(array, n=3)将返回对应于元素[5, 4, 3]的索引[4, 3, 1]。python+numpy的可能副本:从矩阵中获取最小/最大n值和索引的有效方法你的问题不是很清楚。例如,对于...
  • JavaScript数组高阶函数

    2018-03-15 15:53:13
    JavaScript的函数其实都指向某个变量。既然变量可以指向函数函数的...返回一个新数组数组中的元素为原始数组元素调用函数处理后的值。 var arr = [4, 9, 16, 25] var r = arr.map(function(i){ r...
  • ES6数组中删除指定元素

    千次阅读 2021-02-01 03:06:28
    知识点:ES6从数组中删除指定元素findIndex()方法返回数组满足提供测试函数的第一个元素索引。否则返回-1。arr.splice(arr.findIndex(item => item.id === data.id), 1)...
  • 1.数组对象中去除相同ID的项 从后台接口拿到的数据格式是数组对象,但是会存在前后调用同一个接口数据项重复的现象。导致页面中数据显示有重复的。所以在从接口取到数据以后,去除数组中有相同项的对象。 比如我从...
  • Vue中常用的数组方法

    千次阅读 2020-12-23 07:20:55
    (1).filter()filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。是否改变原数组:否是否对空数组进行检测:否语法:const arr= [32, 33, 16, 40];const arr1 = arr.filter...
  • 所有情况都不匹配时,将执行default语句后的   alert( "我们要万无一失!condition什么都不是!" );   二,循环 循环用来指明当某些条件保持为真时要重复的动作。当条件得到满足时,就跳出...
  • Value arr.find(callback[, thisArg]) 查找数组满足要求的第一个元素的值 参数: callback 在数组每一项上执行的函数,接收 3 个参数: element 当前遍历到的元素。 index[可选] 当前遍历到的索
  • 数组中的元素测试条件时返回true时, findIndex() 返回符合条件的元素索引位置,之后的值不会再调用执行函数。 如果没有符合条件的元素返回 -1 注意:findIndex() 对于空数组函数是不会执行的。 注意:find...
  • 方法一:array.indexOf(item,start):元素数组中的位置,如果没与搜索到则返回 -1。 参数 描述 item 必须。查找的元素。 start 可选的整数参数。规定在数组中开始检索的位置。它的合法取值...
  • findIndex()方法返回数组满足提供测试函数的第一个元素索引。否则返回-1。 arr.splice(arr.findIndex(item => item.id === data.id), 1) 1. js中的splice方法 splice(index,len,[item]) 注释:该方法会...
  • 回调函数参数,item(数组元素)、index(序列)、arr(数组本身) 循环数组,无返回值,不改变原数组 不支持return操作输出,return只用于控制循环是否跳出当前循环 var myArr=[{id:1,name:“sdf”},{id:2,name:“dfsdf...
  • 数组的方法

    2020-11-22 16:21:29
    数组的方法 数组 什么是数组数组就是一组有序数据的集合 数组的定义方法: 语法: 第一种方法: var Cars=new Array(); Cars[0]="Saab"; Cars[1]="Volvo"; Cars[2]="BMW"; 第二种方法: var Cars=new Array(...
  • 高效地随机选取数组中的元素

    千次阅读 2016-09-13 12:32:49
    有前端题目大概是这样的:考虑到性能问题,如何快速从一个巨大的数组中随机获取部分元素。 比如有个数组有100K个元素,从中不重复随机选取10K个元素。 为了演示方便我们将数据简化,先给出方案最后再用大点的数据...
  • length -属性:设置或返回数组元素的数目concat() -连接两个或更多的数组,并返回结果。 ...-把数组所有元素放入一个字符串。 -元素通过指定的分隔符进行分隔。 -arrayObject.join(separa

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,881
精华内容 15,552
关键字:

数组满足提供的测试函数的所有元素的索引