如果声明同时切片

时间:2016-03-09 18:02:07

标签: python list numpy slice

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

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替换为空列表的内容?

2 个答案:

答案 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已排序,您可能还会对minmax执行某些操作,而不是选择第一个或最后一个值。

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

In [39]: x=np.arange(0)
In [40]: x[0] if len(x) else 0
Out[40]: 0

我假设您要继续在此循环中使用indexgtrindexlt执行某些操作,然后再转到下一个i