Python中的which()等价于R中的哪个函数?

30

我正在尝试使用NumPy将以下R语句转换为Python:

1 + apply(tmp,1,function(x) length(which(x[1:k] < x[k+1])))

Python有没有一种与which()相当的方法?这里,x是矩阵tmp中的行,k对应于另一个矩阵中的列数。

之前,我尝试了以下Python代码,并收到了一个值错误(操作数无法与形状一起广播):

for row in tmp:
        print np.where(tmp[tmp[:,range(k)] < tmp[:,k]])

你在两次使用 tmp 变量,你的意思是在循环中应该使用 row 变量吗? - Doboy
你的 k 是从哪里来的?你的 tmp 是什么形状? - Pierre GM
这个例子可以,但是这个问题可能会扩展到一个多维布尔数组中,你想要 'True' 值的索引。 - Manu H
2
这是一些相当混淆的 R 代码,用于计算“前面有多少个元素小于 x[k+1]”。我们甚至不需要低效的 length(which(...)),只需要直接对布尔值求和 sum(x[1:k] < x[k+1]) 即可。 - smci
在查找这里提出的问题后,我发现这篇和相关的帖子实际上没有回答它。which()将一个向量与条件进行比较,并返回满足条件的索引向量。我认为这篇文章回答了在这里提出的字面问题。 - Hendy
3个回答

6
    >>> which = lambda lst:list(np.where(lst)[0])
例子: >>> lst = map(lambda x:x<5, range(10)) >>> lst [True, True, True, True, True, False, False, False, False, False] >>> which(lst) [0, 1, 2, 3, 4] 意思是定义一个lambda函数,用于返回一个由非零元素的索引组成的列表。在上面的例子中,我们首先创建了一个名为lst的列表,其中包含值为True或False的布尔值结果。使用which函数,我们可以找到在这个列表中所有值为True的元素的索引位置。

4
尽管这段代码可能能解决问题,但包括一些解释真的有助于提高你的帖子质量。请记住,你的回答是为未来的读者而写的,这些人可能不知道你建议使用代码的原因。 - andreas

4
下面的Python代码回答了我的问题:
np.array([1 + np.sum(row[range(k)] < row[k]) for row in tmp])

这里的tmp是一个二维数组,k是用于列比较的变量。

感谢https://stackoverflow.com/users/601095/doboy为我提供答案的灵感!


1

来自http://effbot.org/zone/python-list.htm

要获取所有匹配项的索引,您可以使用循环,并传入起始索引:

i = -1
try:
    while 1:
        i = L.index(value, i+1)
        print "match at", i
except ValueError:
    pass

19
这段代码可以更简洁易读:matchings_indices = [i for i, val in enumerate(x) if val == value]。该代码的作用是在列表x中找到所有等于value的元素的位置索引,返回一个索引列表matchings_indices。 - Doboy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接