标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。这样为了保存一个简单的[1,2,3],需要有3个指针和三个整数对象。对于数值运算来说这种结构显然比较浪费内存和CPU计算时间。
此外Python还提供了一个array模块,array对象和列表不同,它直接保存数值,和C语言的一维数组比较类似。但是由于它不支持多维,也没有各种运算函数,因此也不适合做数值运算。
NumPy的诞生弥补了这些不足,NumPy提供了两种基本的对象:ndarray(N-dimensional array object)和 ufunc(universal function object)。ndarray是存储单一数据类型的多维数组,而ufunc则是能够对数组进行处理的函数。
创建数组
- 可以通过给array函数传递Python的序列对象创建数组。
NumPy提供了很多专门用来创建数组的函数,如arange函数、linspace函数、logspace函数,random函数、zeros、ones等
import numpy as np a=np.array([1,2,3,4]) b=np.array((1,2,3,4)) #等差/比 print np.arange(1,10,1)#[1 2 3 4 5 6 7 8 9] print np.linspace(1,10,5)#[ 1. 3.25 5.5 7.75 10. ] print np.logspace(1,2,5)#[10. 17.7827941 31.6227766 56.23413252 100. ] #随机数 print np.random.rand(1,5)#第一个参数代表一行[[ 0.54190009 0.88740335 0.26858951 0.52750372 0.83566541]] print np.random.rand(2,5)#两行 print np.random.randint(2,size=5)#5个随机整数[0,2) print np.random.randint(2,5,size=5)#5个随机整数[2,5) #全0或全1 print np.zeros(3)#[ 0. 0. 0. 0. 0.] print np.zeros((3,3))#三行三列为0
获取属性
- ndarray.shape
数组的维度。这是一个指示数组在每个维度上大小的整数元组。 - ndarray.size
数组元素的总个数,等价于shape属性中元组元素的乘积。 - ndarray.dtype
用来描述数组中元素类型的对象. ndarray.reshape
使用数组的reshape方法,可以创建一个改变了尺寸的新数组,原数组的shape保持不变a=np.array([[1,2,3,4],[2,3,4,5]]) print a.shape,a.size,a.dtype //(2, 4) 8 int32 d=a.reshape((4,-1)) //[[1 2],[3 4],[2 3],[4 5]]
注意:
- total size of new array must be unchanged
- 数组a和d其实共享数据存储内存区域,因此修改其中任意一个数组的元素都会同时修改另外一个数组的内容
存取数据
- 数组元素的存取方法和Python的标准方法相同;
- 和Python的列表序列不同,通过下标范围获取的新的数组是原始数组的一个视图。它与原始数组共享同一块数据空间
使用布尔数组,使用布尔数组作为下标获得的数组不和原始数组共享数据空间
a=np.random.rand(5)#[ 0.05056014 0.74492156 0.30582769 0.75466489 0.9813687 ] a[a>0.5]#[ 0.74492156 0.75466489 0.9813687 ]
基本运算
数组的算术运算是按元素的。
a= np.arange(5)
b=np.zeros(5)
print a-b#[ 0. 1. 2. 3. 4.]
print a*b#[ 0. 0. 0. 0. 0.]NumPy中的乘法运算符 * 指示按元素计算,矩阵乘法可以使用 dot 函数或创建矩阵对象实现。dot 函数在处理一维时是点乘,二维时是矩阵相乘。
a=np.array([1,2,3])
b=np.array([3,2,1])
print np.dot(a,b)#10
aa=np.array([[1,1]])
bb=np.arange(1,5).reshape(2,-1)
print np.dot(aa,bb)#[[4 6]]