将元组列表中的y坐标与条件进行比较

问题描述 投票:2回答:5

我有一个清单:

 a = [(1, 2), (3, 4), (4, 5), (6, 7), (5,90)]
 # Stores list of x,y coordinates

和列表:

 b = [(1, 2), (10, 1), (3, 10), (4, 9), (10,9)]

和变量z = 90

现在,我要替换为a中具有y坐标的[C0

=,其中a的y坐标+ 2,条件是b坐标不得超过某个值y 。因此,z绝对不能超过y +2

由于此处z在以下位置等于或大于a

b

我想替换为[(1,2), (3,4), (5,90)] ,以使其变为:

a

我该怎么做?

我知道存在一个带有numpy的方法,例如:

a = [(1,4), (3,6), (4,5), (6,7), (5,90)]

但不确定在这种情况下如何使用。

python numpy
5个回答
1
投票

您需要列表而不是元组

np.where(a >= b) , do something;

Tuples

这是代码,如果您需要在元组中输出

a = [[1, 2], [3, 4], [4, 5], [6, 7], [5,90]]
b = [[1, 2], [10, 1], [3, 1], [4, 9], [10,9]]
z = 90
for n,na in enumerate(a):
    if na[1] >= b[n][1]:
        if na[1] < 89:
            a[n][1] += 2
print(a)

[((1,4),(3,6),(4,5),(6,7),(5,90)]

如果您想让numpy这样做

a = [(1, 2), (3, 4), (4, 5), (6, 7), (5,90)]
b = [(1, 2), (10, 1), (3, 10), (4, 9), (10,9)]

a1 = [list(x) for x in a]
b1 = [list(x) for x in b]
z = 90
for n,na in enumerate(a1):
    if na[1] >= b1[n][1]:
        if na[1] < 89:
            a1[n][1] += 2
        elif na[1] == 89:
            a1[n][1] = 90

a = [tuple(x) for x in a1]

print(a)

输出

[((1,4),(3,6),(4,5),(6,7),(5,90)]


1
投票

Python中的字符串是不可变的,无法更改。您应该使用列表理解来创建新的元组的新列表:

import numpy as np
a = [(1, 2), (3, 4), (4, 5), (6, 7), (5,90)]
b = [(1, 2), (10, 1), (3, 10), (4, 9), (10,9)]
a, b = np.array(a), np.array(b)

z = 90

second_element = np.s_[:, 1]
is_bigger = a[second_element] >= b[second_element]
a[second_element][is_bigger] = np.clip(a[second_element][is_bigger] + 2,
                    a_min=None, a_max=z)
a = [tuple(x) for x in a]
print(a)

Numpy在您的情况下是无用的,因为它不适用于元组。


0
投票

您应该将列表转换为数组以利用NumPy。这会将xs和ys排列为列。这使得使用切片(a = [(ax, min(z, ay + 2 if ay >= by else ay)) for ((ax, ay), (_, by)) in zip(a, b)] )形成针对条件的蒙版变得容易。然后,您可以使用np.s_将数据限制在一定范围内。这样,如果数据很大,您就可以利用向量化操作进行快速操作。

np.clip

0
投票

您可以通过>>> a = np.array([(1, 2), (3, 4), (4, 5), (6, 7), (5,90)]) >>> b = np.array([(1, 2), (10, 1), (3, 10), (4, 9), (10,9)]) >>> z = 90 >>> ys = np.s_[:, 1] >>> mask = a[ys] >= b[ys] >>> a[ys][mask] = np.clip(a[ys][mask] + 2, a_min=None, a_max=z) >>> a array([[ 1, 4], [ 3, 6], [ 4, 5], [ 6, 7], [ 5, 90]]) 通过]执行此操作>

numpy

0
投票

尝试一下:

© www.soinside.com 2019 - 2024. All rights reserved.