列表列表与(2,)数组相乘报错:求DataFrame行对应标量乘法方案
解决逐行与对应标量相乘的问题
嘿,这个广播错误其实是数组形状匹配的小坑!你想要第一行全乘21、第二行全乘24,本质是让每一行对应一个标量进行元素级相乘,下面给你几个简单的实现方式:
方法1:用NumPy调整形状实现广播
你之前的数组a是(2,13)形状,test_y是(2,)形状,直接相乘会因为最后一维不匹配报错。只需要把test_y转换成(2,1)的形状,就能触发正确的广播:
import numpy as np # 假设你的数组a是(2,13) a = np.array([[1,2,3,4,5,6,7,8,9,10,11,12,13], [14,15,16,17,18,19,20,21,22,23,24,25,26]]) test_y = np.array([21,24]) # 用[:, None]把test_y从(2,)转为(2,1) result = a * test_y[:, None]
这里test_y[:, None]会把一维数组变成二维的列向量,此时(2,13)和(2,1)相乘时,NumPy会自动把列向量的每一行重复13次,实现逐行对应相乘。
方法2:直接用Pandas DataFrame的内置方法
如果你还在使用DataFrame的阶段,不用转成数组,直接用mul方法指定轴方向更方便:
import pandas as pd # 假设test是你的2行13列DataFrame test = pd.DataFrame([[1,2,3,4,5,6,7,8,9,10,11,12,13], [14,15,16,17,18,19,20,21,22,23,24,25,26]]) test_y = [21,24] # axis=0表示按行匹配相乘 result_df = test.mul(test_y, axis=0) # 如果需要NumPy数组,直接取values即可 result_array = result_df.values
这个方法更贴合Pandas的使用习惯,代码可读性也更强。
为什么之前会报错?
NumPy的广播规则要求:两个数组的维度从后往前比较,要么维度相等,要么其中一个维度为1。你之前的(2,13)和(2,),从后往前看是13 vs 2,不满足广播条件,所以抛出了形状不匹配的错误。把test_y改成(2,1)后,最后一维是1和13,符合广播规则,就能正常计算啦。
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

