Python Numpy:获取索引大于值且条件为真的数组
我有以下数组:Python Numpy:获取索引大于值且条件为真的数组,python,arrays,numpy,Python,Arrays,Numpy,我有以下数组: a = np.array([6,5,4,3,4,5,6]) 现在我想得到所有大于4的元素,但索引值也大于2。 我发现这样做的方法如下: a[2:][a[2:]>4] 有没有更好或更可读的方法来实现这一点 更新: 这是一个简化版本。实际上,索引是通过对以下几个变量进行算术运算完成的: a[len(trainPredict)+(look_back*2)+1:][a[len(trainPredict)+(look_back*2)+1:]>4] trainPredict
a = np.array([6,5,4,3,4,5,6])
现在我想得到所有大于4的元素,但索引值也大于2。
我发现这样做的方法如下:
a[2:][a[2:]>4]
有没有更好或更可读的方法来实现这一点
更新:
这是一个简化版本。实际上,索引是通过对以下几个变量进行算术运算完成的:
a[len(trainPredict)+(look_back*2)+1:][a[len(trainPredict)+(look_back*2)+1:]>4]
trainPredict
是一个numpy数组,look\u
是一个整数。我想看看是否有一个既定的方法,或者其他人是如何做到这一点的 如果您担心切片的复杂性和/或条件的数量,您可以随时将它们分开:
a = np.array([6,5,4,3,4,5,6])
a_slice = a[2:]
cond_1 = a_slice > 4
res = a_slice[cond_1]
你的例子很简单吗?对于更复杂的操作,可能有更好的解决方案。不仅比您发布的一行更清晰,而且还消除了临时数组的冗余计算。尽管如此,它似乎并不比您最初的方法快
下面的计时都是在初步设置的情况下运行的
import numpy as np
np.random.seed(0xDEADBEEF)
a = np.random.randint(8, size=N)
N
从1e3到1e8不等,系数为10。我尝试了代码的四种变体:
result=a[2:[a[2:>4]
s=a[2:];结果=s[s>4]
result=a[np.flatnonzero(a[2:])+2]
result=a[(a>4)和(np.arange(a.size)>=2)]
python -m timeit -s 'import numpy as np; np.random.seed(0xDEADBEEF); a = np.random.randint(8, size=N)' '<X>'
你是在寻找元素、元素的索引(大概是在原始数组中)还是元素的掩码?@MadPhysician我在寻找数组部分的元素,如示例所示:
a[2:[a[2:]>4]
你应该选择发布的答案。它尽可能的简洁和准确。@Mad物理学家,它和我在问题中写的一样:a[2:[a[2:][a[2:]>4]
,只用三行而不是一行。如果没有其他方法,那么我会有我的答案并选择它。我能想到的其他方法效率都要低得多。我会写一个答案来证明这一点。现有的答案比一行程序更简洁,因为它避免了冗余的临时数组。事实上,我的答案只提高了可读性。由于numpy数组切片是视图,因此无意中听到的创建新变量可能会超过不进行两次切片所带来的性能提升。Edit:但是,在他的更新代码中,按照我的回答分离部分可能会提高性能,因为数值操作创建了新的数组。
CodePope AlexanderCécile MadPhysicist1 MadPhysicist2
1000 3.77e-06 3.69e-06 5.48e-06 6.52e-06
10000 4.6e-05 4.59e-05 3.97e-05 5.93e-05
100000 0.000484 0.000483 0.0004 0.000592
1000000 0.00513 0.00515 0.00503 0.00675
10000000 0.0529 0.0525 0.0617 0.102
100000000 0.657 0.658 0.782 1.09