NumPy:数组计算

NumPy是高性能科学计算和数据分析的基础包,它是pandas等其他各种工具的基础

NumPy的主要功能:

1 ndarray:一个多维数组结构,高效且节省空间
2 无需循环对整个数组进行快速运算的数学函数
3 读写磁盘的工具以及用于操作内存映射文件的工具
4 线性代数,随机数生成和傅里叶变换功能
5 用于集成c,c++等代码的工具

安装方法:

1 pip install numpy

引用方法:

1 import numpy ap np

 NumPy:array-多维数组

array比python列表快,占用空间小

导入sys模块,对比list和np.array占用空间大小
a = list(range(100))
 sys.getsizeof(a)
1016

b = np.array(range(100))
 sys.getsizeof(b)
896
创建ndarray: np.array()

ndarray还可以是多维数组,但元素类型必须相同

为什么要使用ndarray:

例:
已知购物车中没件商品的价格和商品件数,求总金额
import random
方法一:
prize = [random.uniform(10.0,20.0) for i in range(20)] # 价格
num = [random.randint(1, 10) for i in range(20)]  # 数量
prize_np = np.array(prize)
num_np = np.array(num)
 np.dot(prize_np, num_np)  # dot点乘,向量
总金额:1670.34


方法二:
prize_np * num_np
array([153.5 , 120.32,  53.52,  62.75,  73.5 ,  97.  ,  87.5 ,  17.13,
       125.02, 132.16, 144.36, 102.54,  39.36, 129.96,  15.56,  10.72,
        41.44,  73.98,  61.32, 128.7 ])
 _.sum()
总金额:1670.3400000000001

dnarray常用属性

T  数组的转置(对高维数组而言)
dtype  数据元素的数据类型
# a = np.array([1, 2, 3,4,5])
# a.dtype
#dtype('int64')

size  数组元素的个数
# a = np.array([1, 2, 3,4,5])
 #a.size
# 5

ndim  数组的维数
# a = np.array([1, 2, 3,4,5])
#a.ndim
#1

 a = np.arange(15).reshape(3,5)
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
a.ndim
 2


shape  数组维度大小
a = np.arange(20).reshape(4,5)
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])
a.shape
(4, 5)  #4行5列

NumPy:  ndarray-多维数组对象

dtype:
bool_, int(8,16, 32, 64), uint(8,16, 32, 64), float(16, 32, 64)

aptype(): 类型转换
 a = np.array([1,2, 3])
a.dtype
dtype('int64')

b = a.astype(float)
 b.dtype
 dtype('float64')
创建ndarray:
 array(): 将列表转换为数组,可选择显示指定dtype
In [114]: a = np.array([1, 2,3], dtype='float')
In [115]: a
Out[115]: array([1., 2., 3.])

arange()  range的numpy版,支持浮点数
In [116]: np.arange(3, 10, 0.2)
Out[116]: 
array([3. , 3.2, 3.4, 3.6, 3.8, 4. , 4.2, 4.4, 4.6, 4.8, 5. , 5.2, 5.4,
       5.6, 5.8, 6. , 6.2, 6.4, 6.6, 6.8, 7. , 7.2, 7.4, 7.6, 7.8, 8. ,
       8.2, 8.4, 8.6, 8.8, 9. , 9.2, 9.4, 9.6, 9.8])

In [117]: np.arange(3, 10, 2)
Out[117]: array([3, 5, 7, 9])

linspace()  类似arange(),第三个参数为数组长度
np.linspace(0,10,15) #  线性空间,把一个数分成多少份
Out[52]:
array([ 0.        ,  0.71428571,  1.42857143,  2.14285714,  2.85714286,
        3.57142857,  4.28571429,  5.        ,  5.71428571,  6.42857143,
        7.14285714,  7.85714286,  8.57142857,  9.28571429, 10.        ])


zeros()  根据指定形状和dtype创建全0数组
In [124]: np.zeros(10,dtype='int')
Out[124]: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

In [125]: np.zeros(10,dtype='bool')
Out[125]: 
array([False, False, False, False, False, False, False, False, False,
       False])

ones()  根据指定形状和dtype创建全1数组
In [126]: np.ones(10,dtype='int')
Out[126]: array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])

In [127]: np.ones(10,dtype='bool')
Out[127]: 
array([ True,  True,  True,  True,  True,  True,  True,  True,  True,
        True])

empty()   根据指定形状和dtype创建空数组(随机值)
eye()  根据指定边长和dtype创建单位矩阵

NumPy: 索引和切片

数组和标量之间的运算

a+1  a*3 1//a  a**2
In [131]: a = np.array(range(1, 10))

In [132]: a
Out[132]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])

In [133]: a+1
Out[133]: array([ 2,  3,  4,  5,  6,  7,  8,  9, 10])

In [134]: a*3
Out[134]: array([ 3,  6,  9, 12, 15, 18, 21, 24, 27])

In [135]: a//2
Out[135]: array([0, 1, 1, 2, 2, 3, 3, 4, 4])

In [136]: 1//a
Out[136]: array([1, 0, 0, 0, 0, 0, 0, 0, 0])

In [137]: a**2
Out[137]: array([ 1,  4,  9, 16, 25, 36, 49, 64, 81])

同样大小数组之间的运算

a+b  a/b  a**b

In [144]: a = np.array(range(1, 10))

In [145]: b = np.array(range(2, 11))

In [146]: a+b
Out[146]: array([ 3,  5,  7,  9, 11, 13, 15, 17, 19])

In [147]: a/b
Out[147]: array([0, 0, 0, 0, 0, 0, 0, 0, 0])

In [148]: a**b
Out[148]: 
array([         1,          8,         81,       1024,      15625,
           279936,    5764801,  134217728, 3486784401])

数组的索引

In [149]: a = np.array(range(10))
In [150]: a[5]
Out[150]: 5

数组的切片

In [161]: a = np.array(range(10))
In [163]: a[1:6]
Out[163]: array([1, 2, 3, 4, 5])
In [164]: a[-1]
Out[164]: 9

 b = a2.reshape(3,5)  # 多维数组切片,左行右列
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
In [169]: b[0:2, 2:4]  # 1-2行的3-4列
Out[169]: 
array([[2, 3],
       [7, 8]])

In [170]: b[0:2, 3:5]  # 1-2行的4-5列
Out[170]: 
array([[3, 4],
       [8, 9]])

In [171]: b[:, 1]  #所有行的第2列
Out[171]: array([ 1,  6, 11])

与列表不同,数组切片时并不会自动复制,在切片数组上的修改会影响原数组(解决方法:copy())

c = b[:2]
c[-1] = 250
In [173]: b
Out[173]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
In [178]: c = b[:2]

In [179]: c
Out[179]: 
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

In [180]: c[-1] = 250
In [181]: c
Out[181]: 
array([[  0,   1,   2,   3,   4],
       [250, 250, 250, 250, 250]])

In [182]: b
Out[182]: 
array([[  0,   1,   2,   3,   4],
       [250, 250, 250, 250, 250],
       [ 10,  11,  12,  13,  14]])

解决方法copy()
In [185]: b
Out[185]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
In [188]: c = b[:2].copy()

In [189]: c
Out[189]: 
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
In [190]: c[-1] = 250

In [191]: c
Out[191]: 
array([[  0,   1,   2,   3,   4],
       [250, 250, 250, 250, 250]])

In [192]: b
Out[192]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

NumPy:布尔型索引

需求:给一个数组,选出数组中所有小于5的数

a = [random.randint(0, 20) for i in range(20)]

In [70]: a
Out[70]: [20, 19, 4, 13, 6, 15, 6, 10, 12, 17, 16, 15, 19, 10, 9, 4, 3, 12, 18, 12]
aa = np.array(a)

In [73]: aa[aa<5]
Out[73]: array([4, 4, 3])
原理:
a<5会对a中的每一个元素进行判断,返回一个布尔数组
布尔型索引:将同样大小的布尔数组传进索引,会返回一个由索引有True对应位置的元素的数组
aa<5
Out[74]:
array([False, False, True, False, False, False, False, False, False,
False, False, False, False, False, False, True, True, False,
False, False])

需求二:给一个数组,选出数组中所有大于5的偶数

aa[(aa<5)&(aa%2==0)]  # and
Out[77]: array([4, 4])

需求三:给一个数组,选出数组中所有大于5的数和偶数 

aa[(aa>5)|(aa%2==0)]  # or
Out[78]: array([20,  4,  6,  6, 10, 12, 16, 10,  4,  3, 12, 18, 12])

需求四:给一个数组,选出数组中不小于5的数

In [79]: aa[~(aa<5)] # not
Out[79]: array([20, 19, 13,  6, 15,  6, 10, 12, 17, 16, 15, 19, 10,  9, 12, 18, 12])

花式索引

需求一:对于一个数组,选出其中第1,3,6,7,9个元素,组成一个新的二维数组
a[[1,3,6,7,9]]

需求二:对一个二维数组,选出其中第一列和第三列,组成新的二维数组
a[:, [1,3]]
或
a[:,[True, False, True, False, False]]  # 取1,3列
原文地址:https://www.cnblogs.com/YingLai/p/9281528.html