如何使用python的列表推导来执行以下matlab代码?

时间:2016-02-22 11:56:08

标签: python matlab numpy list-comprehension

好的,在Matlab中,我有一个'得分'的一维矢量:

Scores = [3;7;3;2;1;5;1];

我想要做的是从所有小于3的元素中减去0.5。在matlab中我可以这样做:

Scores(Scores < 3) = Scores(Scores < 3 ) - 0.5;

然后我可以使用这个结果来获得一个布尔矢量来表示我要删除相应对象的分数的索引:

animals2Delete = animalIDs(Scores < 2)

所以: 如果我的动物ID列表如下:

animalIDs = [1,2,3,4,5,6,7];

我的matlab代码可以返回:

animals2Delete = [4,5,7]

我的问题是:我能否以有效的方式使用蟒蛇列表理解来做到这一点?或者我需要使用numpy还是其他一些包?

提前谢谢!

4 个答案:

答案 0 :(得分:2)

假设您使用numpy数组:

import numpy as np
Scores = np.array([3,7,3,2,1,5,1])
animalIDs = np.array([1,2,3,4,5,6,7])

只需创建一个布尔掩码,其中得分小于或等于2

animals2Delete = Scores <= 2

然后将此蒙版应用于动物ID:

animalIDs[animals2Delete]
# returns array([4, 5, 7])

或一步完成:

animalIDs[Scores <= 2]

这不使用列表推导,而是使用numpys优化的迭代。结果,至少应该是你想要的。

答案 1 :(得分:1)

看起来像所有得分&lt; 2.5将被删除。

animals2Delete=[]
index=0

for i in Scores:
    if i < 2.5:
        animals2Delete.append(animalIDs[index])
    index+=1

如果我的问题不正确,请告诉我。

答案 2 :(得分:0)

首先,您必须将Scores定义为numpy数组

import numpy as np
Scores = np.array([3, 7, 3, 2, 1, 5, 1])

减去0.5尝试:

Scores[Scores >= 3] = Scores[Scores >= 3] - 0.5

您可以按照以下方式定义animals2Delete

animals2Delete = np.arange(Scores.size)[Scores <= 2]

ps:python可迭代索引从0开始,如C。

答案 3 :(得分:-1)

它可行,但在我看来,它会更容易和更清洁。

没有numpy:

Scores = [3, 7, 3, 2, 1, 5, 1]
Scores = [i-0.5 if i<3 else i for i in Scores]

animalIDs = [1, 2, 3, 4, 5, 6, 7] 
animals2Delete = [id for id, score in zip(animalIDs, Scores) if score < 2]
#this could be made in a number of ways, this is just one way.

numpy逻辑更像是在Matlab中

import numpy as np

Scores = np.array( [3, 7, 3, 2, 1, 5, 1] )
Scores[ Scores < 3 ] = Scores[ Scores < 3 ] - 0.5

animalIDs = np.array( [1, 2, 3, 4, 5, 6, 7] )
animals2Delete = animalIDs[ Scores < 2 ]
#Again, just one way to do it.