精华内容
下载资源
问答
  • 常用哈希函数介绍
    千次阅读
    2021-03-31 16:21:32

    转载自:
    常用哈希函数介绍


    哈希函数介绍

    什么是哈希?在记录的关键字与记录的存储地址之间建立的一种对应关系叫哈希函数。 哈希函数就是一种映射,是从关键字到存储地址的映射。 通常,包含哈希函数的算法的算法复杂度都假设为O(1),这就是为什么在哈希表中搜索数据的时间复杂度会被认为是"平均为O(1)的复杂度".

    在讲解具体内容前,首先我们要清楚以下几个概念:

    冲突(碰撞) 对于不同的关键字ki、kj,若ki != kj,但H(ki) = H(kj)的现象叫冲突(collision) ,即不同的输入却有相同的输出。我们应该尽量避免冲突,因为冲突不仅会使我们在查找的时候效率变慢,还甚至会被攻击者利用从而大量消耗系统资源。 至于冲突的解决方案有很多种,具体可以参考这篇添加哈希表针对冲突的两种方式优缺点是什么?

    哈希函数的应用

    哈希算法广泛应用于很多场景,例如安全加密和数据结构中哈希表的查找,布隆过滤器和负载均衡(一致性哈希)等等。 下面介绍几个常用的哈希算法。

    加密哈希算法

    在安全方面应用主要体现在以下三个方面: (1) 文件校验 (2) 数字签名 (3) 鉴权协议

    在nodejs中我们可以使用原生crypto模块对数据进行加密,crypto.getHashes()查看支持的哈希算法。

    const crypto = require('crypto');
    console.log(crypto.getHashes());
    /*
    [ 'DSA',
      'DSA-SHA',
      'DSA-SHA1',
      'DSA-SHA1-old',
      'RSA-MD4',
      'RSA-MD5',
      'RSA-MDC2',
      'RSA-RIPEMD160',
      'RSA-SHA',
      'RSA-SHA1',
      'RSA-SHA1-2',
      'RSA-SHA224',
      'RSA-SHA256',
      'RSA-SHA384',
      'RSA-SHA512',
      'dsaEncryption',
      'dsaWithSHA',
      'dsaWithSHA1',
      'dss1',
      'ecdsa-with-SHA1',
      'md4',
      'md4WithRSAEncryption',
      'md5',
      'md5WithRSAEncryption',
      'mdc2',
      'mdc2WithRSA',
      'ripemd',
      'ripemd160',
      'ripemd160WithRSA',
      'rmd160',
      'sha',
      'sha1',
      'sha1WithRSAEncryption',
      'sha224',
      'sha224WithRSAEncryption',
      'sha256',
      'sha256WithRSAEncryption',
      'sha384',
      'sha384WithRSAEncryption',
      'sha512',
      'sha512WithRSAEncryption',
      'shaWithRSAEncryption',
      'ssl2-md5',
      'ssl3-md5',
      'ssl3-sha1',
      'whirlpool' ]
    */
    

    除了我们常用的md5,sha-1,sha-2族外,还有像DSA-SHA1,RSA-SHA1,sha1WithRSAEncryption,其中sha1WithRSAEncryption和RSA-SHA1等价,DSA和RSA都是加密算法,DSA和RSA的区别在于,DSA用于签名,而RSA可用于签名和加密。

    下面简单介绍下几种比较常用的加密哈希算法:

    1、 MD5 MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一,主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。 MD5是输入不定长度信息,输出固定长度128-bits的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个128-bits散列。基本方式为,求余、取余、调整长度、与链接变量进行循环运算。得出结果。 NodeJS中使用MD5:

    var hash = crypto.createHash('md5');
    hash.update('test');
    console.log(hash.digest('hex'));    // 098f6bcd4621d373cade4e832627b4f6
    var hash = crypto.createHash('md5');
    hash.update('test1');
    console.log(hash.digest('hex'));    // 5a105e8b9d40e1329780d62ea2265d8a
    

    MD5一度被广泛应用于安全领域。但是在2004年王小云教授公布了MD5、MD4、HAVAL-128、RIPEMD-128几个 Hash函数的碰撞。这是近年来密码学领域最具实质性的研究进展。使用他们的技术,在数个小时内就可以找到MD5碰撞。使本算法不再适合当前的安全环境。目前,MD5计算广泛应用于错误检查。例如在一些BitTorrent下载中,软件通过计算MD5和检验下载到的碎片的完整性。

    2、SHA-1 SHA-1曾经在许多安全协议中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5的后继者。 SHA-1是如今很常见的一种加密哈希算法,HTTPS传输和软件签名认证都很喜欢它,但它毕竟是诞生于1995年的老技术了(出自美国国安局NSA),已经渐渐跟不上时代,被破解的速度也是越来越快。 微软在2013年的Windows 8系统里就改用了SHA-2,Google、Mozilla则宣布2017年1月1日起放弃SHA-1。 当然了,在普通民用场合,SHA-1还是可以继续用的,比如校验下载软件之类的,就像早已经被淘汰的MD5。

    var hash = crypto.createHash('sha1');
    hash.update('test');
    console.log(hash.digest('hex'));    // a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
    

    3、SHA-2 SHA-224、SHA-256、SHA-384,和SHA-512并称为SHA-2。 新的哈希函数并没有接受像SHA-1一样的公众密码社区做详细的检验,所以它们的密码安全性还不被大家广泛的信任。 虽然至今尚未出现对SHA-2有效的攻击,它的算法跟SHA-1基本上仍然相似;因此有些人开始发展其他替代的哈希算法。

    var hash = crypto.createHash('sha256');
    hash.update('test');
    console.log(hash.digest('hex'));    // 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
    

    4、SHA-3 SHA-3,之前名为Keccak算法,是一个加密杂凑算法。 由于对MD5出现成功的破解,以及对SHA-0和SHA-1出现理论上破解的方法,NIST感觉需要一个与之前算法不同的,可替换的加密杂凑算法,也就是现在的SHA-3。

    5、RIPEMD-160 RIPEMD-160 是一个 160 位加密哈希函数。 它旨在用于替代 128 位哈希函数 MD4、MD5 和 RIPEMD。 RIPEMD-160没有输入大小限制,在处理速度方面比SHA2慢。 安全性也没SHA-256和SHA-512好。

    var hash = crypto.createHash('ripemd160');
    hash.update('test');
    console.log(hash.digest('hex'));    // 5e52fee47e6b070565f74372468cdc699de89107
    

    其它加密算法相关
    nodejs除了提供常用加密算法,还提供了HMAC(密钥相关的哈希运算消息认证,类似加盐处理),对称加密算法Cipher(加密)和Decipher(解密),非对称加密算法Signer(签名)和Verify(验证),这里篇幅太长,详细可以参考这几篇讲解得很详细的文章:
    Node.js加密算法库Crypto
    浅谈nodejs中的Crypto模块
    浅谈nodejs中的Crypto模块(补完)

    查找哈希算法

    下面列举几个目前在查找方面比较快的哈希算法(不区分先后),比较老的或者慢的就没举例了,毕竟篇幅有限。

    1、lookup3 Bob Jenkins在1997年发表了一篇关于哈希函数的文章《A hash function for hash Table lookup》,这篇文章自从发表以后现在网上有更多的扩展内容。这篇文章中,Bob广泛收录了很多已有的哈希函数,这其中也包括了他自己所谓的“lookup2”。随后在2006年,Bob发布了lookup3。 Bob很好的实现了散列的均匀分布,但是相对来说比较耗时,它有两个特性,1是具有抗篡改性,既更改输入参数的任何一位都将带来一半以上的位发生变化,2是具有可逆性,但是在逆运算时,它非常耗时。

    2、Murmur3 murmurhash是 Austin Appleby于2008年创立的一种非加密哈希算法,适用于基于哈希进行查找的场景。murmurhash最新版本是MurMurHash3,支持32位、64位及128位值的产生。 MurMur经常用在分布式环境中,比如Hadoop,其特点是高效快速,但是缺点是分布不是很均匀。

    3、FNV-1a FNV又称Fowler/Noll/Vo,来自3位算法设计者的名字(Glenn Fowler、Landon Curt Noll和Phong Vo)。FNV有3种:FNV-0(已过时)、FNV-1、FNV-1a,后两者的差别极小。FNV-1a生成的哈希值有几个特点:无符号整形;哈希值的bits数,是2的n次方(32, 64, 128, 256, 512, 1024),通常32 bits就能满足大多数应用。

    4、CityHash 2011年,google发布CityHash(由Geoff Pike 和Jyrki Alakuijala编写),其性能好于MurmurHash。 但后来CityHash的哈希算法被发现容易受到针对算法漏洞的攻击,该漏洞允许多个哈希冲突发生。

    5、SpookyHash 又是Bob Jenkins哈希牛人的一巨作,于2011年发布的新哈希函数性能优于MurmurHash,但是只给出了128位的输出,后面发布了SpookyHash V2,提供了64位输出。

    6、FarmHash FarmHash也是google发布的,FarmHash从CityHash继承了许多技巧和技术,是它的后继。FarmHash声称从多个方面改进了CityHash。

    7、xxhash xxhash由Yann Collet发表,http://cyan4973.github.io/xxHash/ ,这是它的官网,据说性能很好,似乎被很多开源项目使用,Bloom Filter的首选。

    查找哈希函数的性能比较

    一般性能好的哈希算法都会根据不同系统做优化。 这里有一篇文章详细介绍了各种非加密哈希的性能比较(More Hash Function Tests )。

    文章详细列出了各个平台(甚至包括手机和XBOXOne以及asm.js)之间的哈希算法性能比较,同时也对不同输入数据量做了对比。 似乎在跨平台使用方面CityHash64在64位系统性能最佳,而xxHash32在32位系统性能最好。 在数据量大方面,不同平台也有不同的选择 Intel CPU:总体来说xxhash64更好,随之FarmHash64(如果使用了SSE4.2),xxHash32更适合32位系统。 苹果手机CPU(A9):CityHash64在64位系统性能最佳,而xxHash32在32位系统性能最好。 SpookyV2更适合在XBOXOne中使用。 而短字符串输入使用FNV-1a性能最优(在pc,手机和XBOX中少于8字节,在asm.js中少于20字节),而且它的实现很简单。

    哈希函数的分类

    介绍了那么多哈希函数,实际上哈希函数主要分为以下几类:

    1、加法Hash; 所谓的加法Hash就是把输入元素一个一个的加起来构成最后的结果,prime是素数。

    function addictiveHash(key = '', prime){
        let hash = 0;
        for(let i = 0; i < key.length; ++i){
            hash += key.charCodeAt(i);
        }
    
        return hash % prime;
    }
    
    console.log(addictiveHash('test', 31)); // 14
    console.log(addictiveHash('abc', 31)); // 15
    console.log(addictiveHash('abb', 31)); // 14
    

    2、位运算Hash; 这类型Hash函数通过利用各种位运算(常见的是移位和异或)来充分的混合输入元素。

    function rotatingHash(key = '', prime) {
        let hash = 0;
        for (let i = 0; i < key.length; ++i) {
            hash = (hash << 4) ^ (hash >> 28) ^ key.charCodeAt(i);
        }
        return (hash % prime);
    }
    console.log(rotatingHash('test', 31)); // 13
    console.log(rotatingHash('abc', 31)); // 23
    console.log(rotatingHash('abb', 31)); // 22
    

    3、乘法Hash; 这样的类型的哈希函数利用了乘法的不相关性.乘法哈希里最有名的就是adler32,reactJS的checksum校验就是使用的adler32的改良版。 facebook/react

    function adler32(str) {
        var a = 1, b = 0, L = str.length, M = 0, c = 0, d = 0;
    
        for (var i = 0; i < L;) {
            M = Math.min(L - i, 3850);
            while (M > 0) {
                c = str.charCodeAt(i++);
                if (c < 0x80) { a += c; }
                else if (c < 0x800) {
                    a += 192 | ((c >> 6) & 31); b += a; --M;
                    a += 128 | (c & 63);
                } else if (c >= 0xD800 && c < 0xE000) {
                    c = (c & 1023) + 64; d = str.charCodeAt(i++) & 1023;
                    a += 240 | ((c >> 8) & 7); b += a; --M;
                    a += 128 | ((c >> 2) & 63); b += a; --M;
                    a += 128 | ((d >> 6) & 15) | ((c & 3) << 4); b += a; --M;
                    a += 128 | (d & 63);
                } else {
                    a += 224 | ((c >> 12) & 15); b += a; --M;
                    a += 128 | ((c >> 6) & 63); b += a; --M;
                    a += 128 | (c & 63);
                }
                b += a; --M;
            }
            a = (15 * (a >>> 16) + (a & 65535));
            b = (15 * (b >>> 16) + (b & 65535));
        }
        return ((b % 65521) << 16) | (a % 65521);
    }
    console.log(adler32('test', 31)); // 73204161
    console.log(adler32('abc', 31)); // 38600999
    console.log(adler32('abb', 31)); // 38535462
    

    4、除法Hash; 和乘法一样用了不相关性,但性能不好。

    5、查表Hash; 查表Hash最有名的样例莫过于CRC系列算法。尽管CRC系列算法本身并非查表,可是,查表是它的一种最快的实现方式。以下是CRC32的实现:

    function signed_crc_table() {
    	var c = 0, table = new Array(256);
    
    	for(var n =0; n != 256; ++n){
    		c = n;
    		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
    		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
    		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
    		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
    		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
    		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
    		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
    		c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
    		table[n] = c;
    	}
    
    	return typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;
    }
    
    var T = signed_crc_table();
    function crc32(str, seed) {
    	var C = seed ^ -1;
    	for(var i = 0, L=str.length, c, d; i < L;) {
    		c = str.charCodeAt(i++);
    		if(c < 0x80) {
    			C = (C>>>8) ^ T[(C ^ c)&0xFF];
    		} else if(c < 0x800) {
    			C = (C>>>8) ^ T[(C ^ (192|((c>>6)&31)))&0xFF];
    			C = (C>>>8) ^ T[(C ^ (128|(c&63)))&0xFF];
    		} else if(c >= 0xD800 && c < 0xE000) {
    			c = (c&1023)+64; d = str.charCodeAt(i++)&1023;
    			C = (C>>>8) ^ T[(C ^ (240|((c>>8)&7)))&0xFF];
    			C = (C>>>8) ^ T[(C ^ (128|((c>>2)&63)))&0xFF];
    			C = (C>>>8) ^ T[(C ^ (128|((d>>6)&15)|((c&3)<<4)))&0xFF];
    			C = (C>>>8) ^ T[(C ^ (128|(d&63)))&0xFF];
    		} else {
    			C = (C>>>8) ^ T[(C ^ (224|((c>>12)&15)))&0xFF];
    			C = (C>>>8) ^ T[(C ^ (128|((c>>6)&63)))&0xFF];
    			C = (C>>>8) ^ T[(C ^ (128|(c&63)))&0xFF];
    		}
    	}
    	return C ^ -1;
    }
    console.log(crc32('test', 31)); // -804963899
    console.log(crc32('abc', 31)); // 576628111
    console.log(crc32('abb', 31)); // 1431934233
    

    查表Hash中有名的样例有:Universal Hashing和Zobrist Hashing。他们的表格都是随机生成的。

    6、混合Hash; 混合Hash算法利用了以上各种方式。各种常见的Hash算法,比方MD5、Tiger都属于这个范围。它们一般非常少在面向查找的Hash函数里面使用。

    哈希函数的选择

    那么多种哈希函数,我们究竟该选择哪种呢? 不同的应用场景对哈希的算法设计要求也不一样,但一个好的哈希函数应该具备以下三点:

    1. 抗碰撞性,尽量避免冲突。
    2. 抗篡改性,只要改动一个字节,其哈希值也会很大不同。
    3. 查找效率。

    在加密方面,哈希函数应该对抗碰撞性和抗篡改性要求很高,而会牺牲查找效率。 而且随着时代的变化我们最好还是选择更现代化的哈希函数。 目前来说我们可以选择SHA-2族用于安全加密中,SHA-3更安全但对性能损耗更大。更保险的做法是加盐后混合加密。 在nodejs中我们可以很方便地用crypto.pbkdf2()函数加盐加密,默认会调用hmac算法,用sha-1进行加密,并且可以设置迭代次数和密文长度。常用于用户注册和登录校验流程中。下面的例子我们用伪随机函数randomBytes()生成16字节的盐(更安全的做法是多于16字节)

    const crypto = require('crypto');
    
    let txt = 'test';
    
    //通过伪随机码生成salt,进行加密
    crypto.randomBytes(128, function (err, salt) {
        if (err) throw err;
        salt = salt.toString('hex');
        console.log(salt); //生成salt
    
        crypto.pbkdf2(txt, salt, 4096, 256, function (err,hash) {
            if (err) throw err;
            hash = hash.toString('hex');
            console.log(hash);//生成密文
        })
    })
    
    /*
    6e5e20869916c5aea5f6188807abb0dcd83ca0d3c21ec880bab71c483e7cca624af8c5b6fe2ec820e296452e6e43476
    98411aa545d4c3a21056e02659446b694383b3eedd3a7cbcb9592ede2d5875206f6b764fee69e65271c99d73b818837
    9d0c92e345b046d760b84954babd6740b6928e76ef86e9bfd07c2867837678b575
    (node:1264) DeprecationWarning: crypto.pbkdf2 without specifying a digest is deprecated. Please
     specify a digest
    4572e319f6f5e05ee2507dacc43cd9c6f970e1ed37e76c2a86c99afde11c75f35f04322ee3fec4775a21f1181c0e357
    d00bdf1f1aef4cffe9f11f7859fea658df76553ae37deacc5e085d5e7e38a13ec0f7b0d8f29d738f0cd00cddbd74493
    53547eb651244a6c3e599d86878f80e1be2d269afd3d9ea678982150163fa9e61385f40fabedae2403085e8432a723e
    da8693466068523c9e26afdd0764a21d2372bde7f607af6bcbc8fd4a325ad942688ee770efdf038332a470b7ed7c49e
    7c9b0f8d6a1f9557dd51c3747ac4a7ecabda7089d5685403e6af525de5f84d0b4d7a53ea1fb879afa2cfee4a60775b5
    39614ef451de2dd1ca995a14a79c4236d6089
    */
    

    而在查找方面,哈希函数更追求查找的效率和良好的抗碰撞性。 短字符串输入使用FNV-1a,数量大的在32位系统使用xxhash,64位系统使用FarmHash。

    更多相关内容
  • 常用的算法测试函数原代码matlab版,包括Rosenbrock,Schaffer,Schewel等等
  • python常用内置函数

    千次阅读 2022-02-03 22:32:52
    内置函数bin()、oct()、hex()用来将整数转换为二进制、八进制和十六进制形式,这三个函数都要求参数必须为整数。 remove() 方法在移除一个不存在的元素时会发生错误

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    内置函数bin()、oct()、hex()用来将整数转换为二进制、八进制和十六进制形式,这三个函数都要求参数必须为整数。

    如果需要计算列表中的所有元素的平均值,
    sum()/len()

    str

    str()直接将任意类型参数转化为字符串

    min max

    max()和min()的key参数可以用来指定比较规则
    在这里插入图片描述

    sorted

    sorted()函数对列表、元组、字典、集合或其他可迭代对象进行排序并返回新列表

    reversed

    reversed()对可迭代对象进行翻转并返回可迭代的reversed对象。

    enumerate

    用来枚举可迭代对象中的元素,返回可迭代的enumerate对象,其中每个元素都是包含索引和值的元组
    在这里插入图片描述

    map

    map()把一个函数func依次映射到序列或迭代器对象的每个元素上,并返回一个可迭代的map对象作为结果
    map对象中每个元素是原序列中元素经过函数func处理后的结果

    在这里插入图片描述

    discard

    discard和remove:
    discard删除不存在的元素不会报错,而remove() 方法在移除一个不存在的元素时会发生错误

    展开全文
  • 常见三角函数值对照

    千次阅读 2020-12-21 13:30:33
    常见三角函数值对照2019-12-02 15:06:20文/颜雨三角函数本质是任意角的集合与一个比值的集合的变量之间的映射。接下来分享常见三角函数值对照。三角函数值对照三角函数值口诀30°,45°,60°这三个角的正弦值...

    常见三角函数值对照表2019-12-02 15:06:20文/颜雨

    三角函数本质是任意角的集合与一个比值的集合的变量之间的映射。接下来分享常见三角函数值对照表。

    三角函数值对照表

    三角函数值口诀

    30°,45°,60°这三个角的正弦值和余弦值的共同点是:分母都是2,若把分子都加上根号,则被开方数就相应地变成了1,2,3.正切的特点是将分子全部都带上根号,令分母值为3,则相应的被开方数就是3,9,27。

    记忆口诀一

    三十,四五,六十度,三角函数记牢固;

    分母弦二切是三,分子要把根号添;

    一二三来三二一,切值三九二十七;

    递增正切和正弦,余弦函数要递减.

    记忆口诀二

    一二三三二一,戴上根号对半劈。

    两边根号三,中间竖旗杆。

    分清是增减,试把分母安。

    正首余末三,好记又简单。

    零度九十度,斜线z形连。

    端点均为零,余下竖横填。

    判断三角函数值的符号

    记忆口诀是:奇变偶不变,符号看象限。

    对于π/2*k±α(k∈Z)的三角函数值,

    ①当k是偶数时,得到α的同名函数值,即函数名不改变;

    ②当k是奇数时,得到α相应的余函数值,即sin→cos;cos→sin;tan→cot,cot→tan.(奇变偶不变),然后在前面加上把α看成锐角时原函数值的符号。(符号看象限)

    示例:

    sin(2π-α)=sin(4·π/2-α),k=4为偶数,所以取sinα。

    当α是锐角时,2π-α∈(270°,360°),sin(2π-α)<0,符号为“-”。

    所以sin(2π-α)=-sinα。

    展开全文
  • Python正正则则表达达式式常常用用函函数数总总结结 这篇文章主要介绍了Python正则表达式常用函数,结合实例形式总结分析了Python正则表达式常用函数功能使用 方法及相关注意 项,需要的朋友可以参考下 本文实例总结...
  • 常用numpy函数

    千次阅读 2017-10-19 20:38:35
    于是乎找了学习资料对Numpy库常用函数进行总结,并带了注释。在这里分享给大家,对于库的学习,还是用到时候再查,没必要死记硬背。 PS:本博文摘抄自中国慕课大学上的课程《Python数据分析与展示》,推荐刚...

    trick: 我将函数分好类别并设置好了目录,点击上方目录,可快速查找


    前言:最近学习Python,才发现原来python里的各种库才是大头! 于是乎找了学习资料对Numpy库常用的函数进行总结,并带了注释。在这里分享给大家,对于库的学习,还是用到时候再查,没必要死记硬背。
    PS:本博文摘抄自中国慕课大学上的课程《Python数据分析与展示》,推荐刚入门的同学去学习,这是非常好的入门视频。

    Numpy是科学计算库,是一个强大的N维数组对象ndarray,是广播功能函数。其整合C/C++.fortran代码的工具 ,更是Scipy、Pandas等的基础

    .ndim :维度
    .shape :各维度的尺度 (2,5)
    .size :元素的个数 10
    .dtype :元素的类型 dtype(‘int32’)
    .itemsize :每个元素的大小,以字节为单位 ,每个元素占4个字节
    ndarray数组的创建
    np.arange(n) ; 元素从0到n-1的ndarray类型
    np.ones(shape): 生成全1
    np.zeros((shape), ddtype = np.int32) : 生成int32型的全0
    np.full(shape, val): 生成全为val
    np.eye(n) : 生成单位矩阵

    np.ones_like(a) : 按数组a的形状生成全1的数组
    np.zeros_like(a): 同理
    np.full_like (a, val) : 同理

    np.linspace(1,10,4): 根据起止数据等间距地生成数组
    np.linspace(1,10,4, endpoint = False):endpoint 表示10是否作为生成的元素
    np.concatenate():

    -数组的维度变换

    .reshape(shape) : 不改变当前数组,依shape生成
    .resize(shape) : 改变当前数组,依shape生成
    .swapaxes(ax1, ax2) : 将两个维度调换
    .flatten() : 对数组进行降维,返回折叠后的一位数组

    -数组的类型变换

    数据类型的转换 :a.astype(new_type) : eg, a.astype (np.float)
    数组向列表的转换: a.tolist()
    数组的索引和切片

    - 一维数组切片

    a = np.array ([9, 8, 7, 6, 5, ])
    a[1:4:2] –> array([8, 6]) : a[起始编号:终止编号(不含): 步长]

    - 多维数组索引

    a = np.arange(24).reshape((2, 3, 4))
    a[1, 2, 3] 表示 3个维度上的编号, 各个维度的编号用逗号分隔

    - 多维数组切片

    a [:,:,::2 ] 缺省时,表示从第0个元素开始,到最后一个元素

    数组的运算

    np.abs(a) np.fabs(a) : 取各元素的绝对值
    np.sqrt(a) : 计算各元素的平方根
    np.square(a): 计算各元素的平方
    np.log(a) np.log10(a) np.log2(a) : 计算各元素的自然对数、10、2为底的对数
    np.ceil(a) np.floor(a) : 计算各元素的ceiling 值, floor值(ceiling向上取整,floor向下取整)
    np.rint(a) : 各元素 四舍五入
    np.modf(a) : 将数组各元素的小数和整数部分以两个独立数组形式返回
    np.exp(a) : 计算各元素的指数值
    np.sign(a) : 计算各元素的符号值 1(+),0,-1(-)
    .
    np.maximum(a, b) np.fmax() : 比较(或者计算)元素级的最大值
    np.minimum(a, b) np.fmin() : 取最小值
    np.mod(a, b) : 元素级的模运算
    np.copysign(a, b) : 将b中各元素的符号赋值给数组a的对应元素

    - 数据的CSV文件存取

    CSV (Comma-Separated Value,逗号分隔值) 只能存储一维和二维数组

    np.savetxt(frame, array, fmt=’% .18e’, delimiter = None): frame是文件、字符串等,可以是.gz .bz2的压缩文件; array 表示存入的数组; fmt 表示元素的格式 eg: %d % .2f % .18e ; delimiter: 分割字符串,默认是空格
    eg: np.savetxt(‘a.csv’, a, fmt=%d, delimiter = ‘,’ )

    np.loadtxt(frame, dtype=np.float, delimiter = None, unpack = False) : frame是文件、字符串等,可以是.gz .bz2的压缩文件; dtype:数据类型,读取的数据以此类型存储; delimiter: 分割字符串,默认是空格; unpack: 如果为True, 读入属性将分别写入不同变量。

    -多维数据的存取

    a.tofile(frame, sep=’’, format=’%s’ ) : frame: 文件、字符串; sep: 数据分割字符串,如果是空串,写入文件为二进制 ; format:: 写入数据的格式
    eg: a = np.arange(100).reshape(5, 10, 2)
    a.tofile(“b.dat”, sep=”,”, format=’%d’)

    np.fromfile(frame, dtype = float, count=-1, sep=’’): frame: 文件、字符串 ; dtype: 读取的数据以此类型存储; count:读入元素个数, -1表示读入整个文件; sep: 数据分割字符串,如果是空串,写入文件为二进制

    PS: a.tofile() 和np.fromfile()要配合使用,要知道数据的类型和维度。

    np.save(frame, array) : frame: 文件名,以.npy为扩展名,压缩扩展名为.npz ; array为数组变量
    np.load(fname) : frame: 文件名,以.npy为扩展名,压缩扩展名为

    np.save() 和np.load() 使用时,不用自己考虑数据类型和维度。

    - numpy随机数函数

    numpy 的random子库

    rand(d0, d1, …,dn) : 各元素是[0, 1)的浮点数,服从均匀分布
    randn(d0, d1, …,dn):标准正态分布
    randint(low, high,( shape)): 依shape创建随机整数或整数数组,范围是[ low, high)
    seed(s) : 随机数种子

    shuffle(a) : 根据数组a的第一轴进行随机排列,改变数组a
    permutation(a) : 根据数组a的第一轴进行随机排列, 但是不改变原数组,将生成新数组
    choice(a[, size, replace, p]) : 从一维数组a中以概率p抽取元素, 形成size形状新数组,replace表示是否可以重用元素,默认为False。
    eg: 这里写图片描述
    replace = False时,选取过的元素将不会再选取

    uniform(low, high, size) : 产生均匀分布的数组,起始值为low,high为结束值,size为形状
    normal(loc, scale, size) : 产生正态分布的数组, loc为均值,scale为标准差,size为形状
    poisson(lam, size) : 产生泊松分布的数组, lam随机事件发生概率,size为形状
    eg: a = np.random.uniform(0, 10, (3, 4)) a = np.random.normal(10, 5, (3, 4))

    - numpy的统计函数

    sum(a, axis = None) : 依给定轴axis计算数组a相关元素之和,axis为整数或者元组
    mean(a, axis = None) : 同理,计算平均值
    average(a, axis =None, weights=None) : 依给定轴axis计算数组a相关元素的加权平均值
    std(a, axis = None) :同理,计算标准差
    var(a, axis = None): 计算方差
    eg: np.mean(a, axis =1) : 对数组a的第二维度的数据进行求平均
    a = np.arange(15).reshape(3, 5)
    np.average(a, axis =0, weights =[10, 5, 1]) : 对a第一各维度加权求平均,weights中为权重,注意要和a的第一维匹配

    min(a) max(a) : 计算数组a的最小值和最大值
    argmin(a) argmax(a) : 计算数组a的最小、最大值的下标(注:是一维的下标)
    unravel_index(index, shape) : 根据shape将一维下标index转成多维下标
    ptp(a) : 计算数组a最大值和最小值的差
    median(a) : 计算数组a中元素的中位数(中值)
    eg:a = [[15, 14, 13],
    [12, 11, 10] ]
    np.argmax(a) –> 0
    np.unravel_index( np.argmax(a), a.shape) –> (0,0)

    - numpy的梯度函数

    np.gradient(a) : 计算数组a中元素的梯度,f为多维时,返回每个维度的梯度
    离散梯度: xy坐标轴连续三个x轴坐标对应的y轴值:a, b, c 其中b的梯度是(c-a)/2
    而c的梯度是: (c-b)/1

    当为二维数组时,np.gradient(a) 得出两个数组,第一个数组对应最外层维度的梯度,第二个数组对应第二层维度的梯度。
    这里写图片描述

    - 图像的表示和变换

    PIL, python image library 库
    from PIL import Image
    Image是PIL库中代表一个图像的类(对象)

    im = np.array(Image.open(“.jpg”))

    im = Image.fromarray(b.astype(‘uint8’)) # 生成
    im.save(“路径.jpg”) # 保存

    im = np.array(Image.open(“.jpg”).convert(‘L’)) # convert(‘L’)表示转为灰度图

    版权声明:本文为TensorSense原创文章, 转载请注明出处~~
    展开全文
  • 常用函数的拉氏变换

    千次阅读 2020-06-11 17:54:15
    常用函数的拉氏变换 拉氏变换 ...原函数f(t) 象函数F(s) 1 δ(t)\delta (t) δ(t) 1 2 ε(t)\varepsilon (t) ε(t) 1s\frac{1}{s} s1​ 3 t 1s2\frac{1}{s^2}s21​ 4 tn−1(n−1)!,n=1,2,.
  • MaxCompute常用函数(ODPS常用函数)

    千次阅读 2021-06-28 02:10:44
    场景:使用MaxCompute常用函数 记录:NO.251 MaxCompute是一项大数据计算服务,它能提供快速、完全托管的PB级数据仓库...窗口函数: 具有分组和排序的功能,返回结果不减少原表的行数。 语法:<窗口函数> ove
  • MySQL常用函数

    千次阅读 2021-11-22 09:19:28
    常用函数包含字符串函数、数值函数、日期函数和系统信息函数。 • 字符串函数:该类函数主要用于处理字符串。 • 数值函数:该类函数主要用于处理数字。 • 日期函数:该类函数主要用于处理日期和事件。 • ...
  • 本文转录了常用不定积分的计算公式,求积分时,可以按照被积函数类型直接或经过简单的变形后,在内查得所需的计算公式,从而就可以简便的求出积分。一般来说,查积分可以节约计算积分的时间,但是,只有掌握基本...
  • python常用函数有哪些

    千次阅读 2020-11-24 09:22:23
    Python常用函数:1. print()函数:打印字符串2. raw_input()函数:从用户键盘捕获字符3. len()函数:计算字符长度4. format(12.3654,'6.2f'/'0.3%')函数:实现格式化输出5. type()函数:查询对象的类型6. int()函数...
  • Hive常用函数整理

    千次阅读 多人点赞 2019-03-24 17:16:57
    一、Hive Hive是建立在 Hadoop 上的数据仓库基础架构,定义了简单的类 SQL 查询语言(HQL),以实现MR功能,其提供的一系列函数同样类似于...函数分类方式很多,个人将其分为简单内置函数,高级内置函数以及自定义函数。 ...
  • C/C++常用函数合集

    万次阅读 多人点赞 2018-09-03 22:53:46
    参数解释 is 进行读入操作的输入流,常用cin str 已声明的用于存储读入内容的对象,常为string类型 delim 终结符 作用:将输入流is中读到的字符存入str中,直到遇到终结符delim才结束。如果没有定义delim,则默认为...
  • 【OpenCV】OpenCV常用函数(C++版)

    千次阅读 2020-03-20 17:52:04
    在使用OpenCV的过程中,时常会用到很多函数,而且往往可能会一时记不起这个函数的具体参数怎么设置,故在此将常用函数做一汇总。 本文实例源码github地址:...
  • 2020蓝桥杯常用函数和技巧整理

    千次阅读 多人点赞 2020-10-16 20:56:49
    视频:http://weike.lanqiao.cn/static/coursehuifang/LNZTC++A/content/%E7%AC%AC%E4%B8%80%E8%8A%822013%E5%B9%B4%E7%9C%81%E8%B5%9B%E7%9C%9F%E9%A2%98%E8%AF%A6%E8%A7%A3.html?courseid=18&dayclassid=1097
  • AutoCAD常用函数

    千次阅读 2018-05-11 14:47:34
    AutoCAD常用函数 &amp;lt;article&amp;gt; &amp;lt;div id=&quot;article_content&quot; class=&quot;article_content csdn-tracking-statistics&quot; data-pid=&quot;blog&...
  • Hive常用函数大全一览

    千次阅读 多人点赞 2019-02-18 20:57:22
    :String的比较要注意(常用的时间比较可以先  to_date  之后再比较) hive> select * from iteblog; OK 2011111209 00:00:00 2011111209   hive> select a, b, a, a>b,...
  • MySQL常用判断函数总结!!看你都用过没

    千次阅读 多人点赞 2020-11-02 22:40:06
    说到if else 你肯定不陌生,这种判断函数在各种编程语言中是家常便饭,但在编写SQL语句中,或许你就很少用到了,甚至还...本文带大家一起来看一看MySQL中都有哪些常用的控制流函数,以及控制流函数的使用场景都有哪些?
  • 使用激活函数可以实现网络的高度非线性,这对于建模输入和输出之间的复杂关系非常关键,只有加入了非线性激活函数之后...激活函数和损失函数是神经网络中十分重要的组件,本节介绍深度学习中常用的激活函数和损失函数
  • C++常用函数汇总(持续更新)

    千次阅读 2021-08-10 11:24:17
    文中的内容都表明出处啦,我只写了大概,不如博主写的好,大家见谅哈~ 目录vectoraccumulate vector 作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和...
  • php常用函数总结

    千次阅读 2020-06-04 17:06:50
    usleep() 函数延迟代码执行若干微秒。 unpack() 函数从二进制字符串对数据进行解包。 uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。 time_sleep_until() 函数延迟代码执行直到指定的时间。 time_...
  • C语言常用函数总结

    千次阅读 2018-12-22 08:19:52
    一 进程相关函数 1 exit、_exit和return   exit(0):正常运行程序并退出程序;exit(1):非正常运行导致退出程序;return:返回函数。   return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,...
  • 十五个常用函数公式,值得收藏

    万次阅读 2021-07-24 00:31:09
    标题:十五个常用函数公式,值得收藏小伙伴好啊,今天和大家一起来学习几个常用函数的使用方法。1、判断销售额是否达标IF函数是最常用的判断类函数之一,能完成非此即彼的判断。如下图,考核得分的标准为9分,要...
  • Python给我们内置了大量功能函数,官方文档上列出了69个,有些是我们是平时开发中经常遇到的,也有一些函数很少被用到,这里列举被开发者使用最频繁的8个函数以及他们的详细用法 print print函数是你学Python接触到...
  • 其中的 “c” 表示其中的函数是来自 C标准库,“math”表示为数学常用库函数。此文件作为<math.h>存在C标准库中。 基本运算 函数 作用 示例 abs(float) 取绝对值 cout<<abs(-3.21)<<...
  • 常用的激活函数和python实现

    千次阅读 热门讨论 2021-06-09 14:48:31
      假如只有一个特征是离散值:{fruits:{apple,pear,other}},该特征总共包含了3个不同的分类值,此时需要3个bit位表示该特征的什么值,bit位为1的位置对应特征的值,此时得到的独热码为:{100}
  • 深度学习之常用激活函数

    千次阅读 2018-08-10 10:03:56
    激活函数(Activation Function)一般用于神经网络的层与层之间,将上一层的输出转换之后输入到下一层。如果没有激活函数引入的非线性特性,那么神经网络就只相当于原始感知机的矩阵相乘。   一、激活函数的性质 ...
  • C++-string常用函数整理(建议收藏)

    万次阅读 多人点赞 2021-07-22 10:42:58
    整理C++的string常用函数
  • Python数据分析:pandas常用函数

    千次阅读 2019-01-13 18:45:30
    pandas是python中的 一个数据处理库,...1.df = pd.read_csv("文件路径"):这是读取csv文件的方法,如果要读取excel或其他文档,都有相应的read函数。 2.df.dtypes:如果在文件中有字符型数据返回的是object。 3....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 324,325
精华内容 129,730
关键字:

常用原函数表