NumPy(Numerical Python的简称)是高性能科学计算和数据分析的基础包。
NumPy具有如下功能:
- ndarray数组:一个具有矢量算术运算和复杂广播能力的多维数组,具有快速且节省空间的特点;
- 对整组数据进行快速运算的标准数学函数(无需编写循环);
- 线性代数、随机数生成以及傅里叶变换功能;
- 读写磁盘数据、操作内存映射文件
一,创建数组
1,导入numpy库(需要先在终端下载numpy库),并将其命名为np,
import numpy as npnonp
2,引入ndarry数组
a=[1,2,3] b=np.array(a)
创建一个全为0的二维数组
a=np.([4,3])
创建一个元素从0到20依次递增4的数组
a = np.arange(0, 20, 4)#注意20是取不到的
创建一个二维随机数组
a=np.ramdom.rand(2,3)
二.查看数组属性
ndarray的属性包括shape、dtype、size和ndim等,通过如下代码可以查看ndarray数组的属性。
shape:数组的形状 ndarray.shape,1维数组(N, ),二维数组(M, N),三维数组(M, N, K)。
dtype:数组的数据类型。
size:数组中包含的元素个数 ndarray.size,其大小等于各个维度的长度的乘积。
ndim:数组的维度大小,ndarray.ndim, 其大小等于ndarray.shape所包含元素的个数
a = np.ones([4, 3])
print('a, dtype: {}, shape: {}, size: {}, ndim: {}'.format(a.dtype, a.shape, a.size, a.ndim))
a, dtype: float64, shape: (4, 3), size: 12, ndim: 2
三改变ndarray数组的数据类型和形状
创建ndarray之后,可以对其 数据类型(astype) 或 形状(reshape)
b= np.random.rand(2,6)
print(b)
print('b, dtype: {}, shape: {}'.format(b.dtype, b.shape))
# 转化数据类型 astype
b = b.astype(np.int64)
print('b, dtype: {}, shape: {}'.format(b.dtype, b.shape))
print(b)
# 改变形状 reshape
c = b.reshape([3,4])
print('c, dtype: {}, shape: {}'.format(c.dtype, c.shape))
print(c)
c=b.reshape([3,-1])#-1表示任意数,又python进行运算得出合理结果
[[0.91461658 0.71543877 0.24282372 0.90023941 0.74234782 0.19725609]
[0.00795436 0.57190584 0.59020463 0.4844362 0.8318704 0.73176899]]
b, dtype: float64, shape: (2, 6)
b, dtype: int64, shape: (2, 6)
[[0 0 0 0 0 0]
[0 0 0 0 0 0]]
c, dtype: int64, shape: (3, 4)
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
- 1,基本运算
python中列表直接相加则是将两个列表相加,人而数组则为对应元素相加
a = np.array([1, 2, 3, 4, 5])
b = np.array([10, 20, 30, 40, 50])
c = a + b
print(c)
c=a*b
print(c)
c=b-a
print(c)
c=a**2
print(c)
c=b/a
print(c)
[11 22 33 44 55]
[ 10 40 90 160 250]
[ 9 18 27 36 45]
[ 1 4 9 16 25]
[10. 10. 10. 10. 10.]
numpy还具有广播机制,它会按一定规则自动对数组的维度进行扩展以完成计算
d = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
c = np.array([ 4, 6, 8, 10, 12])
e = d + c
print(e)
[[ 5 8 11 14 17]
[10 13 16 19 22]]
- 一些运算函数
sum
d = np.array([[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10]])
e=np.sum(d, axis=0)#表示对每一列求和
print(e)
e=np.sum(d,axis=1)#表示对每一行求和
print(e)
[ 7 9 11 13 15]
[15 40]
mean
e=np.mean(d)#求平均值
5.5
argsort
a = np.array([[1, 2, 3], [4, 5, 6]])
b=np.argsort(a)
[[0 1 2]
[0 1 2]]
将二维数组转为矩阵运算
a = np.array([[1, 2], [4, 5]])
b=np.mat(a)#将二维数组转为矩阵
c=b*b
c=np.dot(a,a)
[[ 9 12]
[24 33]]
ndarray数组的索引和切片
在编写模型过程中,通常需要访问或者修改ndarray数组某个位置的元素,则需要使用ndarray数组的索引。有些情况下可能需要访问或者修改一些区域的元素,则需要使用ndarray数组的切片。
ndarray数组的索引和切片的使用方式与Python中的list类似。通过[ -n , n-1 ]的下标进行索引,通过内置的slice函数,设置其start,stop和step参数进行切片,从原数组中切割出一个新数组。
ndarray数组的索引是一个内容丰富的主题,因为选取数据子集或单个元素的方式有很多。下面从一维数组和多维数组两个维度介绍索引和切片的方法。
一维ndarray数组的索引和切片
从表面上看,一维数组跟Python列表的功能类似,它们重要区别在于:数组切片产生的新数组,还是指向原来的内存区域,数据不会被复制,视图上的任何修改都会直接反映到源数组上。将一个标量值赋值给一个切片时,该值会自动传播到整个选区。
a = np.arange(10)
b = a[4:7]
a[4:7]=10
[0 1 2 3 4 5 6 7 8 9]
[4 5 6]
[ 0 1 2 3 10 10 10 7 8 9]
多维ndarray数组的索引和切片
多维ndarray数组的索引和切片具有如下特点:
- 在多维数组中,各索引位置上的元素不再是标量而是多维数组。
- 以逗号隔开的索引列表来选取单个元素。
- 在多维数组中,如果省略了后面的索引,则返回对象会是一个维度低一点的ndarray。(它含有高一级维度上的所有数据)。
a = np.arange(1,21)
a=a.reshape(5,2,2)
b=a[0, 1, 1]
print(b)
b=a[0][1]
print(b)
b=a[0]
print(b)
4
[3 4]
[[1 2]
[3 4]]