1

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

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]。有谁知道这是为什么?

4

2 回答 2

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

我不确定您要使用日志和权力做什么,但这应该可以帮助您入门。

于 2013-04-08T14:20:38.297 回答
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]]

编辑2

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

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

# convert signal strength
data[:,-1]= 10**(data[:,-1]/10.)
于 2013-04-08T14:08:49.163 回答