我有一个列表:
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
中的a
中的y坐标,其中b
的y坐标为y坐标+ 2,条件为y
坐标不得超过某个值z
。因此,y +2
绝对不能超过z
。
由于此处a
具有等于或大于b
的内容,
[(1,2), (3,4), (5,90)]
我要替换为a
,以使其变为:
a = [(1,4), (3,6), (4,5), (6,7), (5,90)]
我该怎么办?
我知道存在一种使用numpy的方法,例如:
np.where(a >= b) , do something;
但不确定在这种情况下如何使用它。
答案 0 :(得分:1)
您需要列表而不是元组
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)
如果您需要在元组中输出,这是代码
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)]
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)
输出
[(1,4),(3,6),(4,5),(6,7),(5,90)]
答案 1 :(得分:1)
Python中的字符串是不可变的,无法更改。例如,您应该使用列表理解来创建新的元组的新列表:
a = [(ax, min(z, ay + 2 if ay >= by else ay))
for ((ax, ay), (_, by)) in zip(a, b)]
在您的情况下,Numpy无效,因为它不适用于元组。
答案 2 :(得分:0)
尝试一下:
a = [(1, 2), (3, 4), (4, 5), (6, 7), (5,90)]
b = [(1, 2), (10, 1), (3, 10), (4, 9), (10, 9)]
z=90
c=[]
for index, val in enumerate(a):
try:
y = (val[1]+2 if index < len(b) and len(b[index])>1 and val[1]>=b[index][1] and val[1]+2 <= z else val[1])
c.append((val[0],y))
except:
print("Provide proper inputs.")
a = c
print(a)
或使用列表理解:
c = [(a[index][0],(a[index][1]+2 if a[index][1] >= b[index][1] and a[index][1]+2 < z else a[index][1])) for index in range(len(a))]
a=c
print(c)
答案 3 :(得分:0)
您应该将列表强制转换为数组以利用NumPy。这会将xs和ys排列为列。这使得使用切片(np.s_
)形成针对条件的掩码变得容易。然后,您可以利用np.clip
将数据限制在一定范围内。这样,如果数据很大,则可以利用矢量化操作进行快速操作。
>>> 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]])
答案 4 :(得分:0)
您可以通过
使用numpy
来执行此操作
a = [[1, 2], [3, 4], [4, 5], [6, 7], [5,90]]
b = [[1, 2], [10, 1], [3, 1], [4, 9], [10,9]]
a = np.array(a)
b = np.array(b)
mask_ab = a[:, 1] >= b[:, 1]
mask_smaller = a[:, 1] < 89
mask = np.logical_and(mask_ab, mask_smaller)
a[mask, 1] += 2