如何实现逻辑和数组长度?

时间:2016-03-09 14:09:28

标签: python arrays matlab numpy logical-operators

我需要翻译matlab代码

indexSelect0 = a.index1==0 & a.index2==wRange;
进入快速蟒蛇风格。我的尝试是:

idx1=np.array(np.where(a['index2'][:,0]==wIndex2))
idx=np.array(np.where(a['index1'][:,0]==wIndex1))
indexSelect0 = ma.masked_array(idx,mask=[not (i in idx1[0,:]) for i in idx[0,:]])

但是这需要一段时间,因为数组很长(超过5M的样本)。

问题可以表述为:我有一组由不同观察组成的数据。我有2个索引,让我知道在哪里。但我无法找到合并两个选项来过滤数据的正确方法。

希望很清楚。

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

对于备份我找到了答案。我感谢Anton指导我使用DataFrame

import pandas as pd
d = {'index1': a['index1'][:,0].squeeze(), 'index2': a['index2'][:,0].squeeze(), 'data': x}
df= pd.DataFrame(data=d)
y = df[(df.index1==wIndex1) & (df.index2==wIndex2)]

所以我使用pandas模块的DataFrame和布尔运算符来索引和选择数据(这里更多http://pandas.pydata.org/pandas-docs/stable/indexing.html)。它工作正常:可读,编码简单,速度更快。

答案 1 :(得分:1)

struct转换为dict的MATLAB完全等效于:

indexSelect0 = (a['index1'] == 0) & (a['index2'] == wRange)

在我5岁的笔记本电脑上,我能够在几秒钟内处理1000万个样本:

n = 10000000
a = {'index1': np.random.randint(0, 10, n), 'index2': np.random.randint(0, 10, n)}
wRange = 5
indexSelect0 = (a['index1'] == 0) & (a['index2'] == wRange)