我有一个关于点的距离和角度的信号强度的数据样本列表。数据样本如下所示:
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值/ 10)时我也遇到了问题我似乎无法使索引工作。
b[2]=math.pow(10,b[2]/10)
影响b中的所有列表,而不仅仅是b [2]。谁知道为什么会这样?
答案 0 :(得分: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)]
我不确定你的日志和权力是什么,但这有望让你开始。
答案 1 :(得分:1)
你应该能够用这样的东西得到你想要的东西。
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]]
<强> EDIT2 强>
Numpy数学运算对你提供的整个数组起作用,因此不需要在rssi上循环。
如果您喜欢更多,也可以
# convert signal strength
data[:,-1]= 10**(data[:,-1]/10.)