假设我有一个包含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的类标识)?
谢谢!
答案 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
才能获得最后一个非零元素的索引。