我是Python的新手,所以我在Python中使用矢量化操作和索引时遇到了麻烦。我完全理解如何使用逐元素计算以C风格重写它,但它不像MATLAB代码那样是“pythonic”和简洁的。我希望它简短而简洁。我需要将MATLAB中的下一个代码翻译成Python:
for t=2:size(cl, 1)
hasData=find(isfinite(retGap(t, :)) & op(t, :) < buyPrice(t, :) & op(t, :) > ma(t, :));
[foo idxSort]=sort(retGap(t, hasData), 'ascend');
positionTable(t, hasData(idxSort(1:min(topN, length(idxSort)))))=1;
end
所有阵列都是1500x497浮点数。我可以像这样翻译第一行:
posCl = cl.iloc[t]
posOp = op.iloc[t]
posBp = buyPrice.iloc[t]
posMa = ma.iloc[t]
posRg = retGap.iloc[t]
posRg[pd.notnull(posRg) & (posOp < posBp) & (posOp > posMa)]
但我不知道如何以简洁的方式翻译线条。
答案 0 :(得分:4)
MATLAB是1索引的
MATLAB切片表示法包括端点
Python切片表示法排除了端点
MATLAB开始:步骤:停止
有用的链接: - http://mathesaurus.sourceforge.net/matlab-numpy.html - http://www.matlabtricks.com/post-23/tutorial-on-matrix-indexing-in-matlab
答案 1 :(得分:0)
我已经解决了这个问题!
for t in range(len(cl)):
idx = retGap.iloc[t][pd.notnull(retGap.iloc[t]) & \
(op.iloc[t] < buyPrice.iloc[t]) & \
(op.iloc[t] > ma.iloc[t])].sort_values()[:10].index
positionsTable.iloc[t][idx] = 1