我正在切片的许多列表,例如(使用示例数据):
numbers
然后我有一个循环,它找到第一个值midpoint
的索引位置,该值大于或小于for i in range(len(Values)):
indexgtr = numbers[Values[i]>=midpoint[i]][-1] # The position of the first number larger than the midpoint
indexlt = numbers[Values[i]<=midpoint[i]][0] # The position of the first number larger than the midpoint
值。我有:
indexgtr
然后我使用这些索引位置返回我所拥有的其他一些列表中的值。
我遇到的问题是,有时没有大于或小于中点的值,因此indexlt
或[]
会返回空列表IndexError: index 0 is out of bounds for axis 0 with size 0
,我收到错误{{1} }。
我是否可以添加一些可以捕获此内容并将值0替换为空列表的内容?
答案 0 :(得分:0)
您可以获得所需的结果,并沿第二轴使用argmax
:
>>> midpoint = np.array([[0.2], [0.5], [0.6], [0.3]])
>>> values = np.array([[0.1, 0.3, 0.6, 0.8],
[0.2, 0.3, 0.5, 0.7],
[0.2, 0.5, 0.6, 0.9],
[0.3, 0.1, 0.8, 0.9]])
>>> (values > midpoint).argmax(axis=1) # indexgtr vectorized
array([1, 3, 3, 2]) # first >= occurrence for each row
>>> (values < midpoint).argmax(axis=1)
array([0, 0, 0, 1]) # first < occurrence for each row
注意:我已将<=
和>=
替换为<
和>
,以更好地展示矢量化结果。请注意,对于<
情况,第一行没有任何小于0.2
的列,但返回0
(因为它是第一次出现的False
行1}} S)。
.argmax(axis=1)
找到第二轴上最大值的位置。因为它是一个布尔数组,所以它返回第一个True
次出现。
答案 1 :(得分:0)
您可以通过多种方式表达测试:
for i in range(len(Values)):
indexgtr = numbers[Values[i]>=midpoint[i]]
if indexgtr.shape[0]==0:
indexgtr = 0
else:
indexgtr = indexgtr[-1]
indexlt = numbers[Values[i]<=midpoint[i]]
if indexlt.shape[0]: # alt expression
indexlt = indexlt[0]
else:
indexlt = 0
# indexlt = indexlt[0] if len(indexlt) else 0
他们都有点罗嗦,但我认为它们不贵。除了从numbers
选择子值之外,你在这里不做任何向量的事情。由于numbers
已排序,您可能还会对min
或max
执行某些操作,而不是选择第一个或最后一个值。
使用以下内容测试表达式:
In [39]: x=np.arange(0)
In [40]: x[0] if len(x) else 0
Out[40]: 0
我假设您要继续在此循环中使用indexgtr
和indexlt
执行某些操作,然后再转到下一个i
。