4

Pythonで構造体配列のようなmatlabを作成する方法を考え出すために、私は徹底的に調べました。私が見たいくつかの質問がオンラインにありますが、答えが役に立たないように見えるか、単に私に関連するものとして誤解しているだけかもしれません. それで、先に進みます。次のmatlabコードに相当するpythonを作成しようとしています。

channel                 = [];
channel.PRN             = 0; 
channel.acquiredFreq    = 0; 
channel.codePhase       = 0; 
channel.status          = '-';  
channel = repmat(channel, 1, settings.numberOfChannels); 

repmat は基本的に、settings.numberOfChannels に等しいセル数を持つ channel と呼ばれる構造体配列を作成し、それぞれに PRN、acquiredFreq などがあります。

後で、これらの値を次のように変更するループを実行して、この構造体にアクセスします。

for ii = 1:settings.numberOfChannels
        channel(ii).PRN          = PRNindexes(ii);
        channel(ii).acquiredFreq = acqResults.carrFreq(PRNindexes(ii));
        channel(ii).codePhase    = acqResults.codePhase(PRNindexes(ii));

私はいくつかのアプローチを試しましたが、タイルが numpy を使用している場合 (これは間違って使用していた可能性があります)、または次のようなループを作成しようとするとナンセンスを吐き出します。

class test:
    for iii in range(1,settings.numberOfChannels):
        iii.PRN=0
        iii.acquiredFreq=0
        iii.codePhase=0
        iii.status="-"

初めて使用するので、構文エラーまたはPythonの誤解である可能性が高いと思います。これがこれまたはその性質の何かを尋ねるのに間違った場所である場合は、お詫び申し上げます。

ありがとうございました

4

1 に答える 1

6

更新: Pandasを調査することをお勧めします。その Series と DataFrames は、NumPy 構造化配列よりも操作が簡単で、より多くの機能を備えています。


NumPy構造化配列を使用できます。

import numpy as np
channel = np.zeros(1, dtype = [('PRN',int),
                               ('acquiredFreq',int),
                               ('codePhase',int),
                               ('status','|S1')])

print(channel)
# [(0, 0, 0, '')]

整数によるインデックス付けは、特定の行にアクセスします。

print(channel[0])
# (0, 0, 0, '')

列名によるインデックス付けは、列を配列として返します。

print(channel['PRN'])
# [0]

または、各行をループして各フィールド (列) に割り当てることもできますが、これは NumPy では比較的低速です。

for row in channel:
    row['PRN'] = 1
    row['acquiredFreq'] = 1
    row['codePhase'] = 1
    row['status'] = '+'

print(channel)    
# [(1, 1, 1, '+')]

完全を期すために、行ごとに割り当ててから列ごとに割り当てることもできます。

channel[0]['status'] = '-'
print(channel)
# [(1, 1, 1, '-')]

または、列ごとに割り当ててから行を割り当てます。

channel['PRN'][0] = 10
print(channel)
# [(10, 1, 1, '-')]

あなたが投稿したMatlabコードに最も似ているため、上記を示しました。ただし、NumPy 配列内の個々のセルへの割り当ては遅いことをもう一度強調します。上記を行う NumPy の方法は、代わりに配列全体の割り当てを行うことです。

channel['PRN'] = PRNindexes

ここPRNindexesで、 はシーケンス (リスト、タプル、または NumPy 配列など) です。


ファンシー インデックス(別名「高度なインデックス」) を使用して行を選択することもできます。

index = (channel.status == '+')  # Select all rows with status '+'
channel['PRN'][index] = 10       # Set PRN to 10 for all those rows

ファンシー インデックスは、元の配列のビューではなく、新しい配列を返すことに注意してください。(対照的に、「基本的なスライシング」(例: channel[0]orchannel[1:10]はビューを返しますindex)

channel['PRN'][index] = ...

それよりも

channel[index]['PRN'] = ...
于 2013-02-17T15:25:54.083 に答える