Python广播操作触发ValueError:数组形状匹配问题求助
Numpy数组广播错误:判断点所在区间的问题
问题描述
想要找出数组a中的点落在a0的哪个区间内(实际数据量更大,无法逐个处理),尝试的代码如下:
import numpy as np len0 = 4 a0 = np.linspace(-1, 1, len0) a10 = np.reshape(a0, (1, len0)) len1 = 8 a = np.linspace(-1, 1, len1) a1 = np.reshape(a, (len1, 1)) check = ((a1<a10[1:]) & (a1>=a10[:-1]))
运行后触发错误:
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) Cell In[25], line 9 6 a = np.linspace(-1, 1, len1) 7 a1 = np.reshape(a, (len1, 1)) ----> 9 check = ((a1<a10[1:]) & (a1>=a10[:-1])) 10 check ValueError: operands could not be broadcast together with shapes (8,1) (0,4)
已确认a1形状为(8,1)、a10形状为(1,4),但仍报错,问题出在哪里?
错误原因
a10是形状为(1,4)的二维数组,当执行a10[1:]时,是从行索引1开始截取,但a10只有1行(行索引仅为0),因此得到的是形状为(0,4)的空数组。而a1是(8,1)的数组,空数组和它无法进行广播运算,直接触发ValueError。
你真正需要的是对原始一维数组a0进行切片,获取区间的上下边界,而非对转成二维的a10切片。
修正方案
直接基于a0切片得到区间的上下限,利用numpy的广播特性完成批量判断:
import numpy as np len0 = 4 a0 = np.linspace(-1, 1, len0) len1 = 8 a = np.linspace(-1, 1, len1) a1 = a.reshape(len1, 1) # 保持(8,1)形状,用于广播 # 获取区间的上下边界:a0[:-1]是每个区间的左端点,a0[1:]是每个区间的右端点 lower = a0[:-1] # 形状(3,) upper = a0[1:] # 形状(3,) # 利用广播完成批量比较,得到(8,3)的布尔数组 check = (a1 >= lower) & (a1 < upper)
额外说明
check的形状为(8,3),其中check[i,j]为True表示a[i]落在区间[a0[j], a0[j+1})内。- 如果需要直接获取每个点对应的区间索引,可以用
np.argmax(check, axis=1),它会返回每行中True所在的列索引(前提是每个点仅落在一个区间内)。
内容的提问来源于stack exchange,提问作者pangoline
相关产品推荐
相关产品推荐

