4

我已经彻底环顾四周,试图找出一种在 python 中创建类似 struct 数组的 matlab 方法。我在网上查看了一些问题,答案似乎没有帮助,或者我可能只是误解了它们,因为它们与我有关。所以,继续前进。我正在尝试形成一个等效于以下 matlab 代码的 python。

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 的误解,因为这是我第一次使用它。如果这是不正确的地方问这个或那个性质的东西,我很抱歉。

谢谢

4

1 回答 1

6

更新:您可能想调查Pandas。它的 Series 和 DataFrame 比 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'] = ...
于 2013-02-17T15:25:54.083 回答