从R到Python的转换:一行中最后一个非零元素的索引

时间:2017-07-11 00:02:53

标签: python r

假设我有一个包含10行和60列的R数据帧。从某一点开始,对于每一行,列中有许多尾随零。最后一列包含类标识。例如:

1, 2, 3, 0, 0, 0, .., 0
1, 5, 9, 10, 2, 0, 0, ..., 1

第一行属于第0类,第二行属于第1行。它们各自有许多零。我想隔离非零组件。

我有下面的R函数,它在R:

中有效
keep_max = list()
for(i in 1:nrow(train_data)) {
       keep_max[[i]] = max(which(train_data[i,1:(ncol(train_data)-1)] > 0))
}

[编辑:例如,使用上面给出的两行,这将返回一个包含元素3和5的列表,它们是每行中最后一个非零元素的索引(除了最后一个值,我不知道)我想包括因为它是一个类标签)]。

我正在寻找Python 2.7等价物。我试过了:

for i in range(0, 10):
        x1 = np.where(x_orig[i]==max(x_orig[i,:]))

但是这给了我行的最大值,而不是行中最后一个非零元素的索引。

我也尝试过:

np.where(x_orig[i]==max(x_orig[i,(0:x_orig.shape[1]-1)] >0))

但是我遇到了语法错误。

如何使用Python 2.7找到行中最后一个非零元素的索引(最后一个条目除外,因为它可以是0的类标识)?

谢谢!

2 个答案:

答案 0 :(得分:1)

np.nonzero命令将为您提供所有非零元素的索引。因此,如果您只想排除最后一栏,请执行以下操作:

import numpy as np
x_orig = np.array([(1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0), 
               (1, 5, 9, 10, 2, 0, 0, 0, 0, 0, 1)])
row, col = np.nonzero(x_orig[:,:-1]) # these are the indices
row, col
>> (array([0, 0, 0, 1, 1, 1, 1, 1]), array([0, 1, 2, 0, 1, 2, 3, 4]))

现在,如果您想要最后一个非零项目,您可以执行以下操作:

keep_max = []
for i in range(x_orig.shape[0]):
    keep_max.append([i, col[row == i][-1]])
>> keep_max # again these are the indices of the last non-zero element for each row
[[0, 2], [1, 4]] # i.e. 1st row-3rd element, 2nd row-5th element

答案 1 :(得分:0)

示例数据:

train_data = [1,5,9,10,2,0,0,0,0,0,1]

如果您正在寻找单行代码:

max([i for i, x in enumerate(train_data[:-1]) if x != 0])

如果您正在寻找效率,可以从正面或结尾开始(取决于您是否期望比其他值更多或更少的零)并查看零开始/结束的时间。

for i, x in enumerate(train_data):
    if x == 0:
        i = i - 1
        break

请注意,遇到第一个i时,必须递减0才能获得最后一个非零元素的索引。