Python 二维列表中元素的平均值
我的清单如下:Python 二维列表中元素的平均值,python,list,Python,List,我的清单如下: [[1, 1], [7, 7], [20, 20], [9, 9], [-12, -12]] 我试图得到一个新的列表,里面有相同数量的列表,但是通过计算元素前后的平均值来改变元素的值。 我这是什么意思 假设我有子列表sub=[7,7] 在指数1。我希望这个列表是[9,9],因为sub[1][0]+lst_在sub[0][0]+lst_之后,sub[1][0]=7+1+20=28,28//3=9我想要整数除法 理想的输出是: [[4, 4], [9, 9], [12, 12],
[[1, 1], [7, 7], [20, 20], [9, 9], [-12, -12]]
我试图得到一个新的列表,里面有相同数量的列表,但是通过计算元素前后的平均值来改变元素的值。
我这是什么意思
假设我有子列表sub=[7,7]
在指数1。我希望这个列表是[9,9],因为sub[1][0]+lst_在sub[0][0]+lst_之后,sub[1][0]=7+1+20=28,28//3=9我想要整数除法
理想的输出是:
[[4, 4], [9, 9], [12, 12], [5, 5], [-1, -1]]
我目前拥有以下代码:
copy_l = copy.deepcopy(audio_data)
sub_list = []
for i in range(0, len(audio_data)-1):
sub_data = []
for j in range(2):
if i == 0:
audio_data[i][j] += int(audio_data[i+1][j] / 2)
sub_data.append(audio_data[i][j])
elif audio_data[i+1] == audio_data[-1]:
audio_data[i+1][j] = int((audio_data[i+1][j]+audio_data[i][j])/2)
sub_data.append(audio_data[i+1][j])
else:
audio_data = copy_l
audio_data[i][j] = int((audio_data[i-1][j] + audio_data[i][j] + audio_data[i+1][j])/3)
sub_data.append(audio_data[i][j])
sub_list.append(sub_data)
print(sub_list)
其中audio_data是我传入的列表[[1,1]、[7,7]、[20,20]、[9,9]、-12、-12]]
我将平均计算分为三种情况:
-列表的第一个元素:[1,1]因此平均值仅为1+7//2[1,1]之前没有元素
-列表的最后一个元素:[-12,-12]所以平均值是-12+9//2[-12,-12]之后没有元素
-中间的所有元素
问题是,我的输出子列表是:
[[4, 4], [9, 9], [12, 12], [-1, -1]]
似乎[9,9]永远不会变成[5,5]
有人知道如何实现我想要的吗,或者甚至有人知道如何使它更简单吗?我希望我已经够清楚了,如果不想问我更多的细节,谢谢
编辑:
我正在寻找一个没有numpy、列表理解或zip的解决方案。以下是一种方法:
data = [[1, 1], [7, 7], [20, 20], [9, 9], [-12, -12]]
out = []
for i in range(len(data)):
first = max(i -1, 0) # don't have the start of the slice <0
last = min(i + 2, len(data)) # neither beyond the end of the list
mean = [sum(col) // (last-first) for col in zip(*data[first:last])]
out.append(mean)
print(out)
# [[4, 4], [9, 9], [12, 12], [5, 5], [-2, -2]]
我们对当前项周围的数据进行切片
然后,我们压缩子列表,并计算第一个响应的结果。子列表的第二个值
另外,请注意,使用Python的整数除法,我们得到-3//2的-2,而不是通过舍入到最接近0的值得到的-1。如果您真的想这样做,您必须为分区使用自定义函数。这里有一个NumPy解决方案: 将numpy作为np导入 def Means3数据: 返回np.convolvenp.r_[data[:2].mean,data,data[-2:].mean],np.ones3,'valid'//3 >>>np.沿3、0、音频数据应用 数组[[4,4.], [ 9., 9.], [12., 12.], [ 5., 5.], [-2., -2.]] 或者,如果您喜欢整数除法的intx/y定义: 将numpy作为np导入 def Means3数据: 返回np.convolvenp.r_[data[:2].mean,data,data[-2:].mean],np.ones3,'valid'/3.astypeint >>>np.沿3、0、音频数据应用 数组[[4,4], [ 9, 9], [12, 12], [ 5, 5], [-1, -1]]
如果i==lendata-1,则last=i+2应为last=i+2,否则为1,因为当前您将最终总和除以3,而不是除以2。您的结果意外地与所需的输出一致,如-3//3==-1,但-3//2==-2和int-3/2==-1,但对于大多数其他列表,它将失败。是的!可惜我运气好,没注意到。。。谢谢结果的-1版本可以通过简单的带截断的浮点除法来实现:intsumcol/last first on The off-chance,它对OPHey很重要,感谢这个解决方案,我应该提到我不能使用zip或列表理解!你认为你可以把代码翻译成这样吗?注意最后一个元素可以是-1或-2,这取决于你对整除的定义。您描述的定义:-12+9//2等于-2,而代码int-12+9/2中的计算结果为-1。您是对的,我想要的是Intexpression列表理解和zip有什么问题?我只是不能使用它,我有一些说明。