搜索3个列表中的2个列表的等价性,并平均第3个列表中列表1和列表2相等的所有值(Python)

搜索3个列表中的2个列表的等价性,并平均第3个列表中列表1和列表2相等的所有值(Python),python,numpy,Python,Numpy,我有一个关于点的距离和角度的信号强度的数据样本列表。数据示例如下所示: 0.5,0,-21 0.5,0,-23 1.0,0,-29 1.0,0,-30 0.5,45,-22 0.5,45,-23 其中数据为半径、角度、rssi(信号强度) 正如你所看到的,我对信号强度进行了多次测量,但有些测量具有共同的半径,而另一些测量具有共同的角度。我试图找到一种简单的方法来遍历列表,找到所有具有公共半径和角度的行,平均rssi,并将半径、角度和平均rssi附加到一个新列表中 我尝试这样做的方式是: imp

我有一个关于点的距离和角度的信号强度的数据样本列表。数据示例如下所示:

0.5,0,-21
0.5,0,-23
1.0,0,-29
1.0,0,-30
0.5,45,-22
0.5,45,-23
其中数据为半径、角度、rssi(信号强度)

正如你所看到的,我对信号强度进行了多次测量,但有些测量具有共同的半径,而另一些测量具有共同的角度。我试图找到一种简单的方法来遍历列表,找到所有具有公共半径和角度的行,平均rssi,并将半径、角度和平均rssi附加到一个新列表中

我尝试这样做的方式是:

import numpy as np
import math

#create 3 lists
original_data=[] # list to import the original data to
interim_data=[] # list to group rows with common radii and angles
R=[] 
P=[]
Z=[]

#import data
original_data=np.genfromtxt('bot1.csv', delimiter=',')

#convert rssi to linear
for b in original_data: 
    b[2]=math.pow(10,b[2]/10)

for item in original_data:
    if item[0] and item[1] not in R and P: #check if the common r and theta have been searched for already
        for a in original_data:
            if a[0] == item[0] and a[1] == item[1]:
                interim_data.append(a)
    #Once all rows in orginal data have been checked, average the result in interim data and place in averaged lists R, P and Z         

        Z.append(10*math.log10(sum(interim_data[3])/len(interim_data)))
        R.append(item[0])
        P.append(item[1])
然而,当我运行这个代码Z时,R和p仍然是空的。我已经尝试了一些带有更多for循环的变体,但我想知道是否有一种更简单的方法来完成我正在尝试的工作

当转换为线性值=10^(rssi dBm value/10)时,我也遇到了问题。我似乎无法使索引正常工作

b[2]=math.pow(10,b[2]/10)

影响b中的所有列表,而不仅仅是b[2]。有人知道这是为什么吗?

像这样的东西你应该能得到你想要的东西

import numpy as np
import itertools as it

data = np.array([[0.5,0,-21],
        [0.5,0,-23],
        [1.0,0,-29],
        [1.0,0,-30],
        [0.5,45,-22],
        [0.5,45,-23]])
# convert signal strength
data[:,-1]= np.pow(10, data[:,-1]/10.)

# get the unique values of radius and angles
uradius = np.unique(data[:,0])
uangle = np.unique(data[:,1])

mean_data = []
for ur, ua in it.product(uradius, uangle):
    samepoints = (data[:,0]==ur) & (data[:,1]==ua)
    if samepoints.sum() > 1:  # check if there is more than one match
        mean_data.append([ur, ua, np.mean(data[samepoints,-1])])
    elif samepoints.sum() == 1:
        mean_data.append([ur, ua, data[samepoints,-1]])
编辑

输出(不执行
np.pow(..)

平均数据=[[0.5,0.0,-22.0], [0.5, 45.0, -22.5], [1.0,0.0,-29.5]]

Edit2

Numpy数学运算作用于您提供的整个数组,因此不需要rssi上的循环

如果你喜欢更多,你也可以这样做

# convert signal strength
data[:,-1]= 10**(data[:,-1]/10.)

不太漂亮,但是

import numpy as np
from itertools import groupby

original_data=np.genfromtxt('bot1.csv', delimiter=',')

data = sorted(original_data.tolist(), key=lambda x: x[:2])

[(k, np.mean(list(v),axis=0)[2]) for k, v in groupby(data, lambda x: x[:2])]
哪个输出

[([0.5, 0.0], -22.0), ([0.5, 45.0], -22.5), ([1.0, 0.0], -29.5)]

我不确定你打算用日志和电源做什么,但这应该能让你开始。不需要同时导入numpy和数学。听起来像是
itertools的工作。groupby
pandas
如果Z、R和p保持为空意味着代码永远无法到达那里。另外:如果可以的话,尽量避免显式循环,而同一数组上的双循环对我来说没有多大意义。ps:我试图用4个空格重新格式化你的代码替换标签(在可视化方面有问题,因为在不同的系统上可能有不同的长度),我可能弄乱了缩进。你能检查一下并修改一下吗?是的,看起来很好。当你说不需要导入数学和numpy时,numpy是否具有所有相同的函数,即我可以用np.pow()替换math.pow(),或者numpy是否导入数学本身?你可以看到numpy数学函数。我认为它们都是你可以在
数学中找到的。我认为numpy重新实现了所有这些功能,以便在阵列上使用。在我的答案中检查edit2,我去掉了其中一个循环,这对numpy是无用的。那么,请记录:
np.pow(a,b)
a**b