zarten,互联网一线工作者。
博客地址:zhihu.com/people/zarten
概述
Numpy是python数值计算非常重要的包,其他许多python科学计算的包都是以它为基础,比如:Scipy、Matplotlib、Pandas等,所以Numpy的重要性不言而喻。
Numpy最大的优点之一是提供了高效的大数据数组处理能力,比python内置的list序列更少的内存占用及速度快了很多,因为Numpy是在一个连续的内存块中存储数据以及直接在整个数组上执行复杂计算。
Numpy的多维数组
Numpy最重要的一个特点是可以灵活高效的处理多维数组,并有一个多维数组的对象,即:numpy.ndarray
ndarray对象内的元素必须是相同类型的。
创建多维数组ndarray对象的方法
1.使用array函数创建
第一个参数可以是:可迭代对象、整数、浮点数、其他ndarray对象
import numpy as np
zarten_1 = np.array([1,2,3])print('zarten_1:', zarten_1, type(zarten_1))
zarten_2 = np.array(range(10))print('zarten_2:', zarten_2, type(zarten_2))
zarten_3 = np.array(zarten_2)print('zarten_3:', zarten_3, type(zarten_3))
zarten_4 = np.array(5)print('zarten_4:', zarten_4, type(zarten_4))
zarten_5 = np.array(6.8)print('zarten_5:', zarten_5, type(zarten_5))
也可以是嵌套的序列生成的多维度的ndarray对象
import numpy as np
zarten_1 = np.array([[1,2,3], [4,5,6]])
print(zarten_1)
2.使用zeros函数创建全0数组
第一个参数可以是:指定一个长度、可迭代对象来指定形状
形状的指定一般是2个数字组成,第一个为行数,第二个为列数,如3行2列就是(3,2)
若是3个数字组成,第一个为最外层的维数,第二个为次外层的维数,第三个为最里面有具体元素的个数。若是4个数字组成,以此类推。
import numpy as np
zarten_1 = np.zeros(5)
print('zarten_1:', zarten_1)
zarten_2 = np.zeros([3,2])
print('zarten_2:')
print(zarten_2)
zarten_3 = np.zeros([2,3,4])
print('zarten_3:')
print(zarten_3)
3.使用ones函数创建全1的数组
4.使用empty函数创建没有任何意义的数组
ones和empty用法同zeros相同,这里将不再阐述
5.使用arange函数直接创建连续数字的数组,跟python中的range函数类似
import numpy as np
zarten_1 = np.arange(10)print('zarten_1:', zarten_1)
6.还可以使用random函数创建一些随机数
random.randn(行, 列)
创建具有正态分布的随机数的数组
import numpy as np
zarten_1 = np.random.randn(4,3)
print(zarten_1)
random.randint(最小值,最大值,个数)
创建随机的整数型数组
import numpy as np
zarten_1 = np.random.randint(2, 6, 10)
print(zarten_1)
一些创建随机数函数如下图所示:
以上为一部分常用的创建方式,其他方式可以查看numpy官方文档
多维数组对象ndarray的数据类型
1.可通过dtype属性查看数组内元素的数据类型
import numpy as np
zarten_1 = np.arange(10)
print('zarten_1:', zarten_1)
print(zarten_1.dtype)
从上图可以看到数据类型为:int32,即有符号整型
其实在创建ndarray对象时,可以指定数据类型,只需将dtype参数设置一下就可以了
import numpy as np
zarten_1 = np.array([1,2,3], dtype= np.float64)
print('zarten_1:', zarten_1)
print(zarten_1.dtype)
同时还有一个简写模式,即类型代码,float64简写为:f8 因为占8个字节
这段代码跟上面是等效的
zarten_1 = np.array([1,2,3], dtype= 'f8')
import numpy as np
zarten_1 = np.array([1,2,3], dtype= 'f8')
print('zarten_1:', zarten_1)
print(zarten_1.dtype)
具体的数据类型如下图所示:
2.若要改变已经创建好了的数组的数据类型,可以用ndarray对象的astype函数
import numpy as np
zarten_1 = np.array([1,2,3], dtype= 'f8')
print('zarten_1:', zarten_1)
print(zarten_1.dtype)
zarten_2 = zarten_1.astype('u4')
print('zarten_2:', zarten_2)
print(zarten_2.dtype)
也可将unicode数字字符类型转为相应的整型或浮点型。必须是纯数字字符,不然会报错
import numpy as np
zarten_1 = np.array(['1','2','3'])
print('zarten_1:', zarten_1)
print(zarten_1.dtype)
zarten_2 = zarten_1.astype('u4')
print('zarten_2:', zarten_2)
print(zarten_2.dtype)
由上图可看到“
< : 表示字节顺序,小端模式
U : 表示Unicode类型
1 : 表示元素的长度
Numpy多维数组的运算
简单的运算
ndarray对象的运算效率极高,不用编写循环,运算直接应用在元素级上。
import numpy as np
zarten_1 = np.array([[1,2,3], [4,5,6]])
zarten_2 = zarten_1 * 2
print(zarten_2)
上图可看到,每个元素都乘以2
ndarray对象之间的运算,也是运用在元素级
import numpy as np
zarten_1 = np.array([[1,2,3], [4,5,6]])
zarten_2 = np.array([7,8,9])
print(zarten_1 + zarten_2)
多维数组之间比较,会产生一个布尔类型的数组
import numpy as np
zarten_1 = np.array([[1,2,3], [24,25,26]])
zarten_2 = np.array([7,8,9])
print(zarten_1 > zarten_2)
一元运算
import numpy as np
zarten = np.array([1,2,3,4,5])
print(np.sqrt(zarten))
print(np.sin(zarten))
常见一元运算函数如下所示:
二元运算
import numpy as np
zarten_1 = np.array([1,2,3,4,88])
zarten_2 = np.array([6,7,8,9,10])
print(np.maximum(zarten_1, zarten_2))
print(np.add(1,2))
常用的二元运算函数如下图
三元运算
有时候np.where(cond,one,two) 函数可以很方便处理数组,参数:cond为条件,若数组元素级满足条件就置换为one,否则two
import numpy as np
zarten_1 = np.array([-1,-2,-3,4,88])
zarten = np.where(zarten_1 <0, 0, 999)
print(zarten)
集合运算
numpy中提供一些针对一维的集合运算,如unique函数、in1d函数等
unique函数,跟python中的set集合类似,但unique函数的输出结果是排好序的
import numpy as np
zarten_1 = np.array([5,3,6,5,4,2,1,2])
print(zarten_1)
print('*' * 50)
print(np.unique(zarten_1))
in1d()函数返回一个布尔型数组,用于判断一个数组的元素是否有在另一个数组内
import numpy as np
zarten_1 = np.array([5,3,6,5,4,2,1,2])
print(zarten_1)
print('*' * 50)
print(np.in1d(zarten_1, [5,3]))
其他集合运算如下图所示:
▼ 点击成为社区注册会员 「在看」一下,一起PY!