如何将NumPy数组切片并广播为不同尺寸的NumPy数组?
NumPy数组自定义广播的问题解决
原方法的错误原因
你原来的代码报错是因为链式索引导致赋值目标形状不匹配:A_broadcast[::2][0] 等价于先取数组的第0、2行(得到(2,4)的数组),再取这个子数组的第0行(得到长度为4的一维数组),而A[0]是长度为2的数组,两者形状无法匹配,因此抛出ValueError。
原方法的调整方案
只需要修改索引方式,直接在原数组上定位到需要赋值的具体列位置,而不是链式索引整行:
import numpy as np A = np.array([[1, 3], [2, 4]]) A_broadcast = np.zeros((3, 4)) # 第一行:A[0]赋值到第0、2列 A_broadcast[0, ::2] = A[0] # 第二行:A[1]赋值到第1、3列 A_broadcast[1, 1::2] = A[1] # 第三行:A[0]赋值到偶数列,A[1]赋值到奇数列 A_broadcast[2, ::2] = A[0] A_broadcast[2, 1::2] = A[1] print(A_broadcast) # 输出: # [[1. 0. 3. 0.] # [0. 2. 0. 4.] # [1. 2. 3. 4.]]
更简洁的替代方法
方法1:按行构造后拼接
通过np.stack构造每行的元素模式,再用np.vstack组合成最终数组:
import numpy as np A = np.array([[1, 3], [2, 4]]) # 构造第一行:A[0]元素后插0 row1 = np.stack([A[0], np.zeros_like(A[0])], axis=1).flatten() # 构造第二行:A[1]元素前插0 row2 = np.stack([np.zeros_like(A[1]), A[1]], axis=1).flatten() # 构造第三行:A[0]与A[1]交替 row3 = np.stack([A[0], A[1]], axis=1).flatten() A_broadcast = np.vstack([row1, row2, row3])
方法2:批量索引赋值
利用数组的批量索引功能,一次性完成多位置赋值,减少重复代码:
import numpy as np A = np.array([[1, 3], [2, 4]]) A_broadcast = np.zeros((3, 4)) # 第0、2行的偶数列赋值A[0] A_broadcast[[0, 2], ::2] = A[0] # 第1、2行的奇数列赋值A[1] A_broadcast[[1, 2], 1::2] = A[1]
内容的提问来源于stack exchange,提问作者E. V. Hadzen
相关产品推荐
相关产品推荐

