NumPy的ndarray
ndarray作为NumPy中最重要的特点,你可以利用这个对数组进行数学运算。
下面来看一个简单的例子
In [1]: import numpy as np
In [2]: data = [1, 2, 3, 4, 5] # 创建一个普通的数组
In [3]: data2 = np.array(data) # 通过np.array函数把data转为ndarray对象
In [4]: data2
Out[4]: array([1, 2, 3, 4, 5])
In [5]: data
Out[5]: [1, 2, 3, 4, 5] # 粗略一看发现没什么特别大的区别
继续往下看
In [6]: data2 * 10
Out[6]: array([10, 20, 30, 40, 50]) # ndarray可以很方便的对数组中的每个元素进行数学计算
当然它也可以对多维数组进行运算
In [19]: data = [[1, 2, 3, 4, 5],[5, 4, 3, 2, 1]]
In [20]: data2 = np.array(data) # 发现创建ndarray的过程太过麻烦,有没有更简便点的(继续往下看)
In [21]: data2 * 10
Out[21]:
array([[10, 20, 30, 40, 50],
[50, 40, 30, 20, 10]])
In [22]: data2 + data2
Out[22]:
array([[ 2, 4, 6, 8, 10],
[10, 8, 6, 4, 2]])
In [23]:
常用的几种创建ndarray方式
In [25]: np.zeros(5)
Out[25]: array([0., 0., 0., 0., 0.])
有创建全是0的数组,当然也可以创建全1的数组
In [13]: np.ones(5)
Out[13]: array([1., 1., 1., 1., 1.])
如果想要创建多维数组的话,在参数中传入一个元组即可,例如
In [26]: np.zeros((3,2))
Out[26]:
array([[0., 0.],
[0., 0.],
[0., 0.]])
同样,python中的range在NumPy中也有类似的函数
In [3]: np.arange(10)
Out[3]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
这里分享一个不常用但是很有趣的一个函数eye,它能够创建一个正方的N×N的矩阵,对角线为1其余为0的一个数组,它的方程式为
numpy.eye(N,M=None, k=0, dtype=<type 'float'>)
In [7]: np.eye(10)
Out[7]:
array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]])
方程式中的k决定了对角线1的起始点,如果为正整数则往右移,如果为负整数则往下移
In [14]: np.eye(10, dtype=int, k=2) #在这里k为2,对角线1往右移动了2个单位
Out[14]:
array([[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
In [15]: np.eye(10, dtype=int, k=-2) #如果为-2,则对角线往下移动了2个单位
Out[15]:
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0]])
ndarray的数据类型dtype
数据类型dtype是一个特殊的对象,它们会直接映射到相应的机器上来表示,这样使得我们在以后操作大数据集的读写上数据类型显得尤为重要。
NumPy中常见的数据类型,括号中为类型代码
- int8(i1) 有符号和无符号的8位整型
- int16(i2) 有符号和无符号的16位整型
- int32(i4) 有符号和无符号的32位整型
- int64(i8) 有符号和无符号的64位整型
- float16(f2) 半精度浮点数
- float32(f4或f) 标准的单精度浮点数
- float64(f8或d) 标准的双精度浮点数
- bool(?) 存储True和False的布尔值
- Object(O) python对象
- string_(S) 固定长度的字符串类型,如创建一个长度为10的字符串,应使用S10
下面简单看几个例子
In [21]: arr1 = np.array([1,2,3],dtype=np.float64)
In [22]: arr1.dtype
Out[22]: dtype('float64')
In [21]: arr1 = np.array([1,2,3],dtype='d') #直接通过类型代码来表示数据类型更为简洁
In [22]: arr1.dtype
Out[22]: dtype('float64')
In [23]: arr = np.array(['Bob','Jams','Wiliam','Joe'],dtype=np.string_)
In [24]: arr.dtype
Out[24]: dtype('S6')
数据类型的转换
我们可以通过ndarray的astype方法来转换其dtype
In [25]: arr = np.array([1, 2, 3])
In [26]: arr.dtype
Out[26]: dtype('int64')
In [27]: arr2 = arr.astype(np.float64)
In [28]: arr2.dtype
Out[28]: dtype('float64')
In [29]: arr2
Out[29]: array([1., 2., 3.])
总结
今天学习了NumPy中ndarray的几种常见的创建方式,可以将Python的array通过NumPy下的array函数来转换,也可以通过NumPy的zeros、empty、ones等函数来创建。了解了ndarray中比较常见的数据类型,数据类型在未来做大数据集中十分重要,它直接影响到数据的读写速度和内存大小等问题,这一点千万不能忽视。