找到 3 个 Numpy 数组的交点 Python
Finding the point of intersection of 3 Numpy Arrays Python
我正在尝试编写一个函数,它为我提供 list_2
或 list_3
交叉点 list_
的索引。因此,如果 numpy 代码中有任何交点,它会给我交点。我想按顺序得到十字,所以必须格式化索引列表,以便它会按 list_2 cross, list_3 cross , list_2 cross
或 list_3 cross, list_2 cross , list_3 cross
等的顺序给我一个十字。所以如果发生了十字,它有等待其他数组值越过 list
才能通过。尽管我尝试使用 numpy.where()
函数等,但我不知道如何完成此操作,我也在使用 pandas 模块,因此如果它具有有效的功能,我可以使用那个也是。
变量:
list_ = np.array([9887.89 9902.99 9902.99 9910.23 9920.79 9911.34 9920.01 9927.51 9932.3
9932.33 9928.87 9929.22 9929.22 9935.24 9935.24 9935.26 9935.26 9935.68
9935.68 9940.5 ])
list_2 = np.array([9935.26 9935.26 9935.68 9935.68 9940.5 9925.19 9925.19 9929.62 9929.65
9929.93 9932.55 9936.81 9936.84 9937.26 9932.55 9932.55 9932.55 9932.6
9932.6 9932.6])
list_3_ = np.array([9928.87 9929.22 9929.22 9935.24 9935.24 9935.26 9935.26 9935.68 9935.68
9940.5 9925.19 9925.19 9929.62 9929.65 9929.93 9932.55 9936.81 9936.84
9937.26 9932.55])
剧情:
预期输出:
List_2 cross at 5, List_3 cross at 10, List_2 cross at 14, List_3 cross at 15, List_2 cross at 18, List_3 cross at 19
此函数将数组转换为列表和 returns 元组列表:
def find_cross(list_, list_2, list_3):
list_ = list_.tolist()
list_2 = list_2.tolist()
list_3 = list_3.tolist()
cross = []
i=0
for x,y in zip(list_2, list_3):
if x in list_:
cross.append((i, list_.index(x)))
if y in list_:
cross.append((i, list_.index(y)))
i+=1
return cross
两个系列 a
和 b
之间的交叉点或交点索引是索引 i
其中:
- 要么 (ai < bi 和 ai+1 > bi+1) (
b
从上面穿过 a
)
- 或 (ai > bi 和 ai+1 < bi+1) (
b
从下方穿过 a
)
- or ai = bi (
a
and b
touch)
所以我们可以通过比较 'current' (i-th) 和 'next' (i+1-th) 每个数组的值。
def intersection_points(a, *others):
if a.ndim != 1 or any(other.shape != a.shape for other in others):
raise ValueError('The arrays must be single dimensional and the same length')
others = np.array(others)
indices = np.argwhere(
((a[:-1] < others[..., :-1]) & (a[1:] > others[..., 1:])) |
((a[:-1] > others[..., :-1]) & (a[1:] < others[..., 1:])) |
(a[:-1] == others[..., :-1]))
return indices[indices[:, 1].argsort()] # sort by i
a = np.array([9887.89, 9902.99, 9902.99, 9910.23, 9920.79, 9911.34, 9920.01, 9927.51, 9932.3, 9932.33, 9928.87, 9929.22, 9929.22, 9935.24, 9935.24, 9935.26, 9935.26, 9935.68, 9935.68, 9940.5])
b = np.array([9935.26, 9935.26, 9935.68, 9935.68, 9940.5, 9925.19, 9925.19, 9929.62, 9929.65, 9929.93, 9932.55, 9936.81, 9936.84, 9937.26, 9932.55, 9932.55, 9932.55, 9932.6, 9932.6, 9932.6])
c = np.array([9928.87, 9929.22, 9929.22, 9935.24, 9935.24, 9935.26, 9935.26, 9935.68, 9935.68, 9940.5, 9925.19, 9925.19, 9929.62, 9929.65, 9929.93, 9932.55, 9936.81, 9936.84, 9937.26, 9932.55])
print(intersection_points(a, b, c))
此 returns 格式的交点数组:
[[ 0 7]
[ 0 9]
[ 1 9]
[ 1 11]
[ 1 12]
[ 0 13]
[ 1 15]
[ 1 18]]
意味着 b
(您的 list_2
)与 a
在索引 7、9、13 处相交,并且 c
(您的 list_3
)相交a
位于索引 9、11、12、15 和 18。
您似乎希望返回值以某种方式在不同线的交点和 'wait for the other array values to cross the list before it can go through' 之间交替。尚不完全清楚这在每种情况下意味着什么,但您可以通过像这样操纵结果来做到这一点:
ip = intersection_points(a, b, c)
print(np.concatenate(([ip[0]], ip[1:][ip[:-1, 0] != ip[1:, 0]])))
回归
[[ 0, 7],
[ 1, 9],
[ 0, 13],
[ 1, 15]]
即第一个交叉点是索引 7 处的 b
,然后是索引 9 处的 c
,然后是索引 13 处的 b
,最后是索引 15 处的 c
。
我正在尝试编写一个函数,它为我提供 list_2
或 list_3
交叉点 list_
的索引。因此,如果 numpy 代码中有任何交点,它会给我交点。我想按顺序得到十字,所以必须格式化索引列表,以便它会按 list_2 cross, list_3 cross , list_2 cross
或 list_3 cross, list_2 cross , list_3 cross
等的顺序给我一个十字。所以如果发生了十字,它有等待其他数组值越过 list
才能通过。尽管我尝试使用 numpy.where()
函数等,但我不知道如何完成此操作,我也在使用 pandas 模块,因此如果它具有有效的功能,我可以使用那个也是。
变量:
list_ = np.array([9887.89 9902.99 9902.99 9910.23 9920.79 9911.34 9920.01 9927.51 9932.3
9932.33 9928.87 9929.22 9929.22 9935.24 9935.24 9935.26 9935.26 9935.68
9935.68 9940.5 ])
list_2 = np.array([9935.26 9935.26 9935.68 9935.68 9940.5 9925.19 9925.19 9929.62 9929.65
9929.93 9932.55 9936.81 9936.84 9937.26 9932.55 9932.55 9932.55 9932.6
9932.6 9932.6])
list_3_ = np.array([9928.87 9929.22 9929.22 9935.24 9935.24 9935.26 9935.26 9935.68 9935.68
9940.5 9925.19 9925.19 9929.62 9929.65 9929.93 9932.55 9936.81 9936.84
9937.26 9932.55])
剧情:
预期输出:
List_2 cross at 5, List_3 cross at 10, List_2 cross at 14, List_3 cross at 15, List_2 cross at 18, List_3 cross at 19
此函数将数组转换为列表和 returns 元组列表:
def find_cross(list_, list_2, list_3):
list_ = list_.tolist()
list_2 = list_2.tolist()
list_3 = list_3.tolist()
cross = []
i=0
for x,y in zip(list_2, list_3):
if x in list_:
cross.append((i, list_.index(x)))
if y in list_:
cross.append((i, list_.index(y)))
i+=1
return cross
两个系列 a
和 b
之间的交叉点或交点索引是索引 i
其中:
- 要么 (ai < bi 和 ai+1 > bi+1) (
b
从上面穿过a
) - 或 (ai > bi 和 ai+1 < bi+1) (
b
从下方穿过a
) - or ai = bi (
a
andb
touch)
所以我们可以通过比较 'current' (i-th) 和 'next' (i+1-th) 每个数组的值。
def intersection_points(a, *others):
if a.ndim != 1 or any(other.shape != a.shape for other in others):
raise ValueError('The arrays must be single dimensional and the same length')
others = np.array(others)
indices = np.argwhere(
((a[:-1] < others[..., :-1]) & (a[1:] > others[..., 1:])) |
((a[:-1] > others[..., :-1]) & (a[1:] < others[..., 1:])) |
(a[:-1] == others[..., :-1]))
return indices[indices[:, 1].argsort()] # sort by i
a = np.array([9887.89, 9902.99, 9902.99, 9910.23, 9920.79, 9911.34, 9920.01, 9927.51, 9932.3, 9932.33, 9928.87, 9929.22, 9929.22, 9935.24, 9935.24, 9935.26, 9935.26, 9935.68, 9935.68, 9940.5])
b = np.array([9935.26, 9935.26, 9935.68, 9935.68, 9940.5, 9925.19, 9925.19, 9929.62, 9929.65, 9929.93, 9932.55, 9936.81, 9936.84, 9937.26, 9932.55, 9932.55, 9932.55, 9932.6, 9932.6, 9932.6])
c = np.array([9928.87, 9929.22, 9929.22, 9935.24, 9935.24, 9935.26, 9935.26, 9935.68, 9935.68, 9940.5, 9925.19, 9925.19, 9929.62, 9929.65, 9929.93, 9932.55, 9936.81, 9936.84, 9937.26, 9932.55])
print(intersection_points(a, b, c))
此 returns 格式的交点数组:
[[ 0 7]
[ 0 9]
[ 1 9]
[ 1 11]
[ 1 12]
[ 0 13]
[ 1 15]
[ 1 18]]
意味着 b
(您的 list_2
)与 a
在索引 7、9、13 处相交,并且 c
(您的 list_3
)相交a
位于索引 9、11、12、15 和 18。
您似乎希望返回值以某种方式在不同线的交点和 'wait for the other array values to cross the list before it can go through' 之间交替。尚不完全清楚这在每种情况下意味着什么,但您可以通过像这样操纵结果来做到这一点:
ip = intersection_points(a, b, c)
print(np.concatenate(([ip[0]], ip[1:][ip[:-1, 0] != ip[1:, 0]])))
回归
[[ 0, 7],
[ 1, 9],
[ 0, 13],
[ 1, 15]]
即第一个交叉点是索引 7 处的 b
,然后是索引 9 处的 c
,然后是索引 13 处的 b
,最后是索引 15 处的 c
。