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]]