2013-02-17 82 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