Matlab结构体数组转换为Python

4

我已经仔细查看了各种资料,试图找到一种在Python中创建类似于Matlab结构体数组的方法。我查看了一些网上的问题,但是它们提供的答案要么不太有用,要么可能只是我误解了它们与我的相关性。所以,接下来我将尝试形成一个Python版本的以下Matlab代码的等价物。

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

repmat 会创建一个名为 channel 的结构体数组,其中单元格数等于 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时的误解。如果这不是提问的正确位置或类似的问题,我很抱歉。谢谢。
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]channel [1:10])返回一个视图。)因此,如果您想进行更改原始数组的赋值,请先按列选择,然后再进行花式索引(index

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

而不是

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

1
这正是我所需要的...在花费了这么多时间之后,您设法减轻了我所有的挫败感。谢谢! - user2080649

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接