一、认识NumPy数组对象
NumPy中最重要的一个特点就是其N维数组对象,即ndarray(别名array)对象,该对象可以执行一些科学计算。
ndarray对象中定义了一些重要的属性。
二、创建NumPy数组
1.最简单的创建ndarray对象的方式是使用array()函数,在调用该函数时传入一个列表或者元组
-
import numpy as np
-
# 创建一个一维数组
-
data1 = np.array([1, 2, 3]) 或者 data2 = np.array([[1, 2, 3], [4, 5, 6]])
-
print(data1)
2.通过zeros()函数创建元素值都是0的数组;通过ones()函数创建元素值都为1的数组。
-
import numpy as np
-
# 创建元素值全是0的数组
-
d1=np.zeros((3, 4))
-
print(d1)
-
# 创建元素值全是1的数组
-
d2=np.ones((3, 4))
-
print(d2)
-
3.通过empty()函数创建一个新的数组,该数组只分配了内存空间,它里面填充的元素都是随机的
-
通过arange()函数可以创建一个等差数组,它的功能类似于range(),只不过arange()函数返回的结果是数组,而不是列表。
-
import numpy as np
-
# 创建元素值全是随机数的数组
-
da1=np.empty((5, 2))
-
print(da1)
-
#创建一个等差数组
-
#从1开始到20结束,间隔是5
-
da2=np.arange(1, 20, 5)
-
print(da2)
三、查看数据类型
ndarray.dtype可以创建一个表示数据类型的对象,如果希望获取数据类型的名称,则需要访问name属性进行获取。
通过zeros()、ones()、empty()函数创建的数组,默认的数据类型为float64。 默认情况下,64位windows系统输出的结果为int32, 64位Linux或macOS系统输出结果为int64,当然也可以通过dtype来指定数据类型的长度。
每一个NumPy内置的数据类型都有一个特征码,它能唯一标识一种数据类型。
ndarray对象的数据类型可以通过astype()方法进行转换。
import numpy as np
data = np.array([[1, 2, 3], [4, 5, 6]])
print(data.dtype)
# 数据类型转换为float64
float_data = data.astype(np.float64)
print(float_data.dtype)
四、矢量化运算
1.数组运算可以分为以下三种:
1.矢量化运算2.广播机制3.数组与标量运算
2.形状相等的数组之间的任何算术运算都会应用到元素级,即只用于位置相同的元素之间,所得的运算结果组成一个新的数组
当形状不相等的数组执行算术计算的时候,就会出现广播机制,该机制会对数组进行扩展,使数组的shape属性值一样,这样就可以进行矢量化运算了
广播机制需要满足如下任意一个条件即可:
(1)两个数组的某一维度等长。 (2)其中一个数组为一维数组。 广播机制需要扩展维度小的数组,使得它与维度最大的数组的shape值相同,以便使用元素级函数或者运算符进行运算。
标量运算会产生一个与数组具有相同行和列的新矩阵,其原始矩阵的每个元素都被相加、相减、相乘或者相除。
五、整数索引和切片的基本使用
对于一维数组来说,从表面上来看,它使用索引和切片的方式,与Python列表的功能相差不大。
arr = np.arange(8)
# 获取索引为5的元素
arr[5]
# 获取索引为3~5的元素,但不包括5
arr[3:5]
对于多维数组来说,索引和切片的使用方式与列表就大不一样了,比如二维数组的索引方式如下
在二维数组中,每个索引位置上的元素不再是一个标量了,而是一个一维数组。
如果想获取二维数组的单个元素,则需要通过形如“arr[x,y]”的索引来实现,其中x表示行号,y表示列号。
多维数组的切片是沿着行或列的方向选取元素的,我们可以传入一个切片,也可以传入多个切片,还可以将切片与整数索引混合使用。
import numpy as np
arr2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 获取索引为1的元素
arr2d[1]
####array([4, 5, 6])
# 获取位于第0行第1列的元素
arr2d[0, 1]
####2
#使用一个切片示例:
arr2d[:2]
####array([[1, 2, 3],
#### [4, 5, 6]])
#使用两个切片示例:
arr2d[0:2, 0:2]
####array([[1, 2],
### # [4, 5]])
#切片与整数索引混合使用的示例:
arr2d[1, :2]
####array([[1, 2],
# ### [4, 5]])
花式索引是NumPy的一个术语,是指用整数数组或列表进行索引,然后再将数组或列表中的每个元素作为下标进行取值。
当使用一个数组或列表作为索引时,如果使用索引要操作的对象是一维数组,则获取的结果是对应下标的元素。
如果要操作的对象是一个二维数组,则获取的结果就是对应下标的一行数据。
# 创建一个二维数组
demo_arr = np.empty((4, 4))
for i in range(4):
demo_arr[i] = np.arange(i, i + 4)
# 获取索引为[0,2]的元素
demo_arr[[0, 2]]
如果用两个花式索引操作数组,则会将第1个作为行索引,第2个作为列索引,以二维数组索引的方式选取其对应位置的元素。
获取索引为(1,1)和(3,2)的元素 demo_arr[[1, 3], [1, 2]]
布尔型索引指的是将一个布尔数组作为数组索引,返回的数据是布尔数组中True对应位置的值。
array([False, False, True, False])
数组的转置指的是将数组中的每个元素按照一定的规则进行位置变换。
NumPy提供了两种实现方式:
T属性
transpose()方法
六、NumPy通用函数
常见的一元通用函数如下表:
常见的二元通用函数如下表:
六、数据处理
NumPy的where()函数是三元表达式x if condition else y的矢量化版本。
import numpy as np
arr_x = np.array([1, 5, 7])
arr_y = np.array([2, 6, 8])
arr_con = np.array([True, False, True])
result = np.where(arr_con, arr_x, arr_y)
####array([1, 6, 7])
通过NumPy库中的相关方法,我们可以很方便地运用Python进行数组的统计汇总。
如果希望对NumPy数组中的元素进行排序,可以通过sort()方法实现
如果希望对任何一个轴上的元素进行排序,则需要将轴的编号作为sort()方法的参数传入
import numpy as np
arr = np.array([[6, 2, 7],
[3, 6, 2],
[4, 3, 2]])
arr.sort()
####array([[2, 6, 7],
#### [2, 3, 6],
#### [2, 3, 4]])
arr = np.array([[6, 2, 7],
[3, 6, 2],
[4, 3, 2]])
# 沿着编号为0的轴对元素排序
arr.sort(0)
####array([[3, 2, 2],
#### [4, 3, 2],
#### [6, 6, 7]])
all()函数用于判断整个数组中的元素的值是否全部满足条件,如果满足条件返回True,否则返回False。
any()函数用于判断整个数组中的元素至少有一个满足条件就返回True,否则就返回False。
import numpy as np
arr = np.array([[1, -2, -7],
[-3, 6, 2],
[-4, 3, 2]])
# arr的所有元素是否都大于0
np.all(arr > 0)
####False
####
####
arr = np.array([[1, -2, -7],
[-3, 6, 2],
[-4, 3, 2]])
# arr的所有元素是否有一个大于0
np.any(arr > 0)
####True
针对一维数组,NumPy提供了unique()函数来找出数组中的唯一值,并返回排序后的结果
in1d()函数用于判断数组中的元素是否在另一个数组中存在,该函数返回的是一个布尔型的数组
import numpy as np
arr = np.array([12, 11, 34, 23, 12, 8, 11])
np.unique(arr)
#### array([ 8, 11, 12, 23, 34])
####
arr = np.array([12, 11, 34, 23, 12, 8, 11])
np.in1d(arr, [11, 12])
####array([ True, True, False,
# ### False,
#### True, False, True])