ValueError: operands could not be broadcast together with shapes(XX, XX) (XX, XX)报错及解决办法

1、报错解释:

        这个报错的大致意思是说在进行两个数组的运算时,数组的大小不匹配。因此不能直接进行运算。

        参考了网络上一些关于这个报错的相关解决方案,发现触发这个报错的原因不唯一,因此我会先介绍一下我的代码编写背景,供遇到问题的各位先确认一下报错原因与我遇到的问题是否一致。最后提出检查及解决办法

2、代码背景:

        我的代码运行文件夹为UAV_data,文件夹内包含了不同日期的无人机数据;而在每个日期的文件夹内,包含了1个真彩色影像、1张DSM影像、4个单波段影像以及6个植被指数影像共11份数据。在文件夹中的分布如下图所示:

        而我要做的就是用代码读取出4张单波段影像,然后对其进行运算得到一些新的植被指数。因此编写了代码来循环读取并存储在data_list数组中:

data_list = []

for file_name in os.listdir(sub_folder_path):
    file_path = os.path.join(sub_folder_path, file_name)
    if file_path.endswith('.tif'):
        data, meta = tiff_read(file_path)
        data_list.append(data)

        接下来我就要读取出NIR近红外波段数据和R红光波段数据来进行计算,按照常规的文件排序(或者说按照我自己下意识认为的读取顺序),我就把data_list[6]作为了NIR数据,把data_list[8]作为了R数据。问题就出在了这里。

3、问题检查及解决

        因为是相同数据源得到的数据,所以理论上来说两张数据的像元数量不会出现不相等的情况,于是我打印了上述代码生成的数组:

if os.path.isdir(sub_folder_path):
    print("!!!!!开始打印!!!!!")
    data_list = []
    meta = None

    for file_name in os.listdir(sub_folder_path):
        file_path = os.path.join(sub_folder_path, file_name)
        if file_path.endswith('.tif'):
            print(file_path)
            data, meta = tiff_read(file_path)
            data_list.append(data)

        同一日期内的打印结果(左)和文件夹中文件排序(右)如下图所示:

        可以看出,程序内的for循环读取顺序跟常规的逻辑是不太一致的,emmm具体原因其实我这个代码小白也不是太清楚哈哈哈不好意思,也欢迎大家评论补充呦。

        所以NIR数据虽然还是data_list[6],而R数据其实是data_list[10]而不是data_list[8]。读取到的data_list[8]应该是result_20240627.tif,这个数据是无人机可见光相机拍摄的真彩色数据,像素比多光谱相机要高。这也是为什么我读取数据以后为什么像元数量不匹配的原因了。

        最后,重新按照程序读取的顺序运算就没有问题啦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值