数组(ndarray)与列表 ( list ) 类似,是具有相同类型的多个元素构成的整体。
数组局限:
数组元素要求是相同类型,而列表的元素可以是不同类型。
数组优势:
数组可以与标量进行运算,数组之间也可以进行矢量化运算。
数组在运算时,具有广播能力。
数组底层使用C程序编写,运算速度快。
数组底层使用C中数组的存储方式(紧凑存储),节省内存空间。
应用对比
# 数组的局限性,每个元素必须是相同的类型,python中的列表,每个元素都可以是不同类型
a = np.array([1,2,"ddd"]) # 都存储成字符类型
a = np.array([1,2,1.2]) # 将三个元素都存储成float类型
代码举例:python中的列表,给列表中的每个元素+100,给数组中的每个元素+100,分别list和array都是如何操作
li=[1,2,3]
for i in range(len(li)):
li[i]=li[i]+100
array 的操作 100标量 a是数组(矢量),操作的时候,会使用矢量中的每个元素跟标量进行运算。
a = np.arange(1,4)
a + 100
多个元素的矢量可以标量进行操作,通过【广播】来进行完成的
广播:为了进行对位运算,而尽量将两个数组中的一个数组(也可能是标量),扩展成跟另外一个数组相同的维度。
数组跟其他矢量进行运算,也可以通过广播来进行。
维度相同(可以进行直接的对位运算)
a = np.arange(1,4)
b = np.arange(10,40,10)
a+b # 进行对位运算
# result
array([11, 22, 33])
维度如果不同,也可以通过广播,来尽量匹配成对位的模式,来进行运算
# 维度不同的情况下,最低维度的个数相同即可。
a=np.arange(1,4)
b=np.array([[10,20,30],[100,200,300]])
a + b
# result
array([[ 11, 22, 33],
[101, 202, 303]])
不是所有的情况,在任何场景下都能进行广播来进行矢量化运算 。要对位相同才行。
d = np.array([1,2])
b = np.array([[2,3,4],[5,6,7]])
a + b # 会报错
数组底层使用C程序编写,运算速度快,使用对列表进行循环的方式来创建新列表
数组底层使用C中数组的存储方式(紧凑存储),节省内存空间。
数据结构" 数组 "存储多个元素时,使用的最广泛一种数据结构
数组存储特点:连续空间上存储元素
优点:数组的随机访问性特别好。
验证内存:ndarray占用的内存要比列表少