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[2] だけでなく、b のすべてのリストに影響します。その理由を知っている人はいますか?

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 に答える