切片时的if语句

2024-09-29 22:40:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有许多要切片的列表,例如(使用示例数据):

midpoint = [[0.2], [0.5], [0.6]]
Values = [[0.1, 0.3, 0.6, 0.8], [0.2,0.3,0.5,0.7], [0.2,0.5,0.6,0.9]]
numbers = numpy.arange(0, len(Values), 1) 

然后我有一个循环,从大于或小于midpoint值的第一个值的numbers查找索引位置。我有:

^{pr2}$

然后,我使用这些索引位置来返回其他列表中的值。在

我遇到的问题是,有时没有大于或小于中点的值,因此indexgtrindexlt返回一个空列表[],我得到错误IndexError: index 0 is out of bounds for axis 0 with size 0。在

有什么我可以添加的东西来捕捉这个并在空列表中替换一个0值吗?在


Tags: 数据numpy示例列表len错误切片values
2条回答

您可以沿着第二个轴矢量化并使用^{}获得所需的结果:

>>> 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的行的第一次出现)。在

.argmax(axis=1)找到第二个轴上最大值的位置。因为它是一个布尔数组,所以它返回第一个True出现。在

有多种方法可以表达测试:

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或{}执行某些操作,而不是选择第一个或最后一个值。在

使用以下内容测试表达式:

^{pr2}$

我假设在继续下一个i之前,您将在这个循环中对indexgtr和{}执行一些操作。在

相关问题 更多 >

    热门问题