2013-02-17 109 views
4

我已經徹底地四處尋找嘗試找出一種方法來創建一個像python結構數組的matlab。我在網上看到了一些問題,或者答案似乎沒有幫助,或者我可能只是誤解他們,因爲他們與我有關。所以,繼續前進。我正試圖形成一個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並且每個那些將具有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的誤解,因爲這是我第一次使用它。如果這是不正確的地方問這個或那種性質,我很抱歉。

謝謝

回答

6

更新:您可能需要調查Pandas。它的 系列和數據幀比NumPy 結構化陣列更易於使用和更全面的功能。


你可以使用NumPy的structured array

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的陣列)。


您還可以使用fancy indexing(又名「高級索引」)來選擇行:

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

只要記住,看中的索引返回一個新的數組,原數組不是一個視圖。 (相比之下,「基本切片」(例如channel[0]channel[1:10]返回一個視圖。)所以,如果你想首先改變原有的陣列,通過列選擇作業,然後看中指數(index

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

而比

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

這正是我所需要的......在花了這麼多時間之後,你設法減輕了我所有的挫折感謝,謝謝! – user2080649 2013-02-17 15:53:42