NumPy指定单字段结构化dtype创建数组时元素重复是什么原因
NumPy结构化数组字段填充异常的原因
这一现象是由NumPy构造结构化数组时的输入解析规则差异导致的,核心区别在于单字段结构化dtype和多字段结构化dtype的输入匹配逻辑不同:
第一种单字段dtype场景的问题原因
你执行的代码:
list_example = np.array([[1,2,3]], dtype=[('example', 'i4', (3,))])
此处定义的dtype是仅含1个字段的结构化类型,每个数组元素需要是形状为(3,)的int32子数组。
你传入的输入是[[1,2,3]],NumPy会默认将输入中的每个标量值(1、2、3)分别对应为一个完整的结构化元素,当输入值的形状和字段要求的(3,)不匹配时,会自动通过广播填充成对应形状,因此1被填充为[1,1,1]、2被填充为[2,2,2]、3被填充为[3,3,3],最终得到形状为(1,3)的数组,就出现了你看到的元素重复现象。
如果要在单字段场景下正常赋值,需要将对应字段的值用元组包裹,明确告诉NumPy这是一个完整结构化元素的字段值,正确写法如下:
# 输出为array([([1, 2, 3],)], dtype=[('example', '<i4', (3,))]),无重复填充 list_example = np.array([([1,2,3],)], dtype=[('example', 'i4', (3,))])
第二种多字段dtype场景的正常原因
你执行的代码:
np.array([([1,2,3], 255)], dtype = [('example', 'i4', (3,)), ('color', 'u1')])
此处定义的是含2个字段的结构化dtype,NumPy在解析多字段结构化数组的输入时,会默认将输入中的每个元组对应为一个完整的结构化元素,元组内的元素按顺序匹配dtype的各个字段。
你传入的([1,2,3], 255)正好匹配两个字段的形状要求:第一个元素[1,2,3]匹配example字段的(3,)形状,第二个元素255匹配color字段的标量要求,因此直接赋值不需要广播填充,自然不会出现元素重复。
内容的提问来源于stack exchange,提问作者Eldir
相关产品推荐
相关产品推荐

