我已经仔细研究过尝试找出一种在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(我可能刚刚使用不正确)的tile的情况下或者当我尝试进行如下循环时,它会吐出废话:
class test:
for iii in range(1,settings.numberOfChannels):
iii.PRN=0
iii.acquiredFreq=0
iii.codePhase=0
iii.status="-"
我很可能认为这是一个语法错误或我对python的误解,因为这是我第一次使用它。如果这是一个不正确的地方问这个或那种性质,我道歉。
谢谢
答案 0 :(得分:6)
更新:您可能需要调查Pandas。它的 系列和DataFrame比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
是一个序列(例如list,tuple或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]
会返回一个视图。)因此,如果要进行更改原始数组的赋值,请先按列选择,然后选择花式索引({{ 1}})
index
而不是
channel['PRN'][index] = ...