Python中NumPy数组的高级赋值与索引技巧
本文深入解析Python中NumPy数组的赋值与索引机制。通过对比list与array在分隔符、数据类型、形状属性及乘法操作上的差异,重点演示如何利用布尔列表或数组对NumPy数组进行高效筛选赋值。文章指出列表不支持此类索引操作,并提供了具体的代码示例与错误分析,帮助开发者掌握NumPy的核心用法。
NumPy数组与列表的基础差异
首先展示一段基础代码示例:
import numpy as np
list_a = list(range(10))
print("list_a: {}".format(list_a))
array_a = np.array(list_a)
print("array_a: {}".format(array_a))
list_b = [True,False,True,True,False,False,True,False,True,False]
print("list_b: {}".format(list_b))
array_b = np.array(list_b)
print("array_b: {}".format(array_b))
mask = np.zeros(10,dtype=np.bool)
print("mask: {}".format(mask))
运行上述代码后的输出结果如下:
list_a: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
array_a: [0 1 2 3 4 5 6 7 8 9]
list_b: [True, False, True, True, False, False, True, False, True, False]
array_b: [ True False True True False False True False True False]
mask: [False False False False False False False False False False]
通过对比输出可以发现,list与array在显示格式上存在显著差异:list元素间以逗号分隔,而array元素间以空格分隔。此外,使用numpy中的zeros函数生成的是array对象。除了显示格式,list和array在内部机制上还有诸多不同,具体包括:
list是Python内置的普通列表对象,支持append和extend方法,但不具备shape属性;而array是numpy库中的专用对象,不支持append和extend方法,但拥有shape属性用于描述维度。
在数据存储类型方面,list允许存储不同类型的数据,如int、float、str或布尔值;而array要求所有元素必须为相同类型。
在运算支持上,list不支持直接的乘法操作;array则支持乘法运算。
针对赋值操作,赋值的目标对象必须是array,而用于索引的对象既可以是array也可以是list:
利用布尔索引进行数组赋值
d = array_a[list_b]
print("array_a[list_b]: {}".format(d))
e = array_a[array_b]
print("array_a[array_b]: {}".format(e))
mask[list_b] = 1
print("mask: {}".format(mask))
相关代码的执行输出如下:
array_a[list_b]: [0 2 3 6 8]
array_a[array_b]: [0 2 3 6 8]
mask: [ True False True True False False True False True False]
这种操作方式能够从array_a中提取出对应于b数组或列表中True位置的所有元素,并组成一个新的数组。
如果尝试对列表执行相同的赋值操作,即将代码中的array_a替换为list_a,程序将抛出错误:
d = list_a[list_b]
TypeError: list indices must be integers or slices, not list
e = list_a[array_b]
TypeError: only integer scalar arrays can be converted to a scalar index
以上就是关于Python中NumPy数组赋值技巧的完整分享,希望能为读者提供有价值的参考,并欢迎大家继续支持本站获取更多技术内容。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













