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

2024-06-01 15:30:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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]。有人知道为什么吗?你知道吗


Tags: andtoinimport列表fordata半径
2条回答

不太漂亮但是

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)]

我不知道你想要什么日志和权力,但这应该希望让你开始。你知道吗

你应该能用这样的东西得到你想要的。你知道吗

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(..)

mean_data = [[0.5, 0.0, -22.0], [0.5, 45.0, -22.5], [1.0, 0.0, -29.5]]

编辑2

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

如果你更喜欢,你也可以做

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

相关问题 更多 >