文章目录
本文是Numpy基础,适合把Numpy基础操作都忘了的人阅读。
数组基础
1.1 创建一个数组
数组有多种创建方法,最基本的方法是将序列传递给array
函数,你可以传递任何序列(类数组),而不仅仅是常见的列表(list)数据类型。
np.array
传递一个序列,根据传进来的序列构造numpy数组
np.arange
类似Python中的range,参数为start,end,step,构造一个符合条件的整数组成的数组
np.zeros
传递一个shape,一维的话就是一个数字,二维的就是一个元组,构造一个全0的numpy数组
np.ones
与np.zeros
一样,也是传递一个shape,构造全1的numpy数组
np.linspace
参数一般分别为start,end,元素个数
以上只是日常用法,也并未完全涵盖所有参数,如果遇到别的情况,参考numpy.linspace
注意,Python中是没有数组的概念的,只有列表,列表的列表,列表的列表的列表(或者序列的序列)。所以用
np.array()
创建高维数组时,我们传递的其实是“列表的列表…”
# 1D Array
a = np.array([0, 1, 2, 3, 4])
b = np.array((0, 1, 2, 3, 4))
c = np.arange(5)
d = np.linspace(0, 2*np.pi, 5)
print(a) # >>>[0 1 2 3 4]
print(b) # >>>[0 1 2 3 4]
print(c) # >>>[0 1 2 3 4]
print(d) # >>>[ 0. 1.57079633 3.14159265 4.71238898 6.28318531]
print(a[3]) # >>>3
1.2 多维数组切片
多维数组切片时,维度以逗号分隔,通过对每个维度进行单独的切片,从而进行多维的切片。
比如,在二维数组中,第一片进行行的切片,第二片进行列的切片。
对于每个维度,切片的形式为start:end:step
,缺省时start=0, end=-1,step=1
。
# MD slicing
print(a[0, 1:4]) # >>>[12 13 14]
print(a[1:4, 0]) # >>>[16 21 26]
print(a[::2,::2]) # >>>[[11 13 15]
# [21 23 25]
# [31 33 35]]
print(a[:, 1]) # >>>[12 17 22 27 32]
1.3 数组的属性
数组的属性是指a.shape和 a.dtype
等,如何获取一个数组的这些基本信息,也是需要熟悉的基础知识。
type(a)
Python函数,返回Python中一个数据结构的数据类型
a.shape
数组的形状
a.dtype
数组中元素的数组类型。通常整数默认是np.int64
a.size
数组中的元素个数
a.itemsize
每个元素的字节数,np.int64
就是8字节
a.dim
数组的维度数。二维数组的维度数是2
a.nbytes
数组的所有元素共占有多少字节
# Array properties
a = np.array([[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25],
[26, 27, 28 ,29, 30],
[31, 32, 33, 34, 35]])
print(type(a)) # >>><class 'numpy.ndarray'>
print(a.dtype) # >>>int64
print(a.size) # >>>25
print(a.shape) # >>>(5, 5)
print(a.itemsize) # >>>8
print(a.ndim) # >>>2
print(a.nbytes) # >>>200
使用数组
2.1 基本操作
numpy数组基本的操作运算,包括四则运算(+, -, *, /
)、乘方(**
)、逻辑运算(>, <, 等
)、点积(dot
)。点积是矩阵乘法,其他的运算都i是逐元素进行。
# Basic Operators
a = np.arange(25)
a = a.reshape((5, 5))
b = np.array([10, 62, 1, 14, 2, 56, 79, 2, 1, 45,
4, 92, 5, 55, 63, 43, 35, 6, 53, 24,
56, 3, 56, 44, 78])
b = b.reshape((5,5))
print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(a ** 2)
print(a < b) print(a > b)
print(a.dot(b))
2.2 特殊运算
对于numpy数组的一些特殊处理,比如找出numpy数组所有元素中的最大值、最小值,对numpy数组中的元素求和。
a.min()
找出数组中的最小元素
a.max()
找出数组中的最大元素
a.sum()
求出数组中元素的和
a.cumsum()
返回一个数组,其中的每个元素都是 前面所有元素的和
索引进阶
3.1 Fancy Indexing
花式索引
# Fancy indexing
a = np.arange(0, 100, 10)
indices = [1, 5, -1]
b = a[indices]
print(a) # >>>[ 0 10 20 30 40 50 60 70 80 90]
print(b) # >>>[10 50 90]
3.2 Boolean Masking
布尔屏蔽
将numpy数组进行逻辑运算,得到一个相同shape的mask,再以a[mask]
得到boolean masking的结果。注意得到的新numpy数组具有新的shape
# Boolean masking
import matplotlib.pyplot as plt
a = np.linspace(0, 2 * np.pi, 50)
b = np.sin(a)
plt.plot(a,b)
mask = b >= 0
plt.plot(a[mask], b[mask], 'bo')
mask = (b >= 0) & (a <= np.pi / 2)
plt.plot(a[mask], b[mask], 'go')
plt.show()
3.3 Where
np.where
可以得到经过条件筛选后的新numpy数组,一般条件可以是a < 2
等numpy数组的逻辑运算。
# Where
a = np.arange(0, 100, 10)
b = np.where(a < 50)
c = np.where(a >= 50)[0]
print(b) # >>>(array([0, 1, 2, 3, 4]),)
print(c) # >>>[5 6 7 8 9]