NumPy数组进行数学计算
NumPy在数据分析、建模、AI等领域有非常重要的作用,比如机器学习算法需要处理大量的数据,使用数组能大大提高效率。NumPy数组的优点之一在于使您能够对数据进行批处理操作,而无需编写任何 for 循环对数组中的每个元素遍历计算。相等大小的数组之间的任何算术运算都按元素应用运算符进行计算。
1.乘法 减法 平方 除法运算
import numpy as np
arr = np.array([[1., 2., 3.], [4., 5., 6.]])
#乘法运算
arr_1 = arr * arr
print(arr_1)
#减法运算
arr_2 = arr - arr
print(arr_2)
#平方运算
arr_3 = arr ** 2
print(arr_3)
#除法运算
arr_4 = 1 / arr
print(arr_4)
以下对应输出arr_1, arr_2, arr_3, arr_4结果输出:
arr_1输出 :
[[ 1. 4. 9.]
[16. 25. 36.]]
arr_2输出:
[[0. 0. 0.]
[0. 0. 0.]]
arr_3输出:
[[ 1. 4. 9.]
[16. 25. 36.]]
arr_4输出:
[[1. 0.5 0.33333333]
[0.25 0.2 0.16666667]]
对于上面的1/arr 是将1除以arr数组中每个位置上的元素。
2.比较运算
import numpy as np
arr = np.array([[1., 2., 3.], [4., 5., 6.]])
arr2 = np.array([[0., 4., 1.5], [8., 1., 22.]])
#比较运算
arr_5 = arr > arr2
print(arr_5)
以上输出:
[[ True False True]
[False True False]]
比较运算符需要相同shape属性的数组进行比较,否则会报错。如下
3.数组的索引和切片
NumPy 数组索引可以有多种方式来选择子集或单个元素。
对于一维数组相对很简单,一维数组的子集或单个元素的选择类似于Python 列表。
arr = np.arange(10) 生成如下一维数组
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
选择单个元素:arr[5] 用中括号,‘5’是索引位置,从0开始算,输出5
选择数组子集:arr[5:8]中括号中,‘5‘表示起始索引位置,’8‘表示结束索引位置,输出的子集不包括索引8所在的元素。输出[5 6 7]。
4.数组元素重新赋值
对于上面的一维数组我们可以给单个元素赋值,也可以通过选择的子集给多个元素赋予相同的值,如下:
arr[5] = 55 arr数组输出[0, 1, 2, 3, 4, 55, 6, 7, 8, 9]
arr[5:8] = 55 arr数组输出[0, 1, 2, 3, 4, 55, 55, 55, 8, 9]。
注意:与 Python 的内置列表的区别是数组子集(切片)是原始数组上的引用(或者可以理解为指针或视图)。这意味着所选的子集数据不会被复制,对子集的任何修改都将反映在源数组中。看如下示例:
arr_slice = arr[5:8] 将子集赋值给一个变量,当前这个变量输出[55, 55, 55]。arr_slice当前也可以理解为一个一维数组。我们将arr_slice数组的索引位置为1的元素重新赋值,arr_slice[1] = 555,则当前arr_slice输出[55, 555, 55],同时输出arr数组输出[0, 1, 2, 3, 4, 55, 555, 55, 8, 9]。
另外如果中括号中的冒号左右不带任何索引值,也表示将赋值给所有元素,例如:arr_slice[:]=66 则arr输出[0, 1, 2, 3, 4, 66, 66, 66, 8, 9]
之所有NumPy的数组不设计成复制数据,是因为通常我们用NumPy处理大量的数据,如果大量的复制,内存和性能会大大受影响。但如果你确实需要一个副本,可以用copy函数,例如:arr_slice=arr[5:8].copy()
好累~~~~~~下次接着学高维数组的计算索引等知识。