【发布时间】:2017-08-19 07:24:59
【问题描述】:
考虑两个 n 维,可能重叠,numpy meshgrids,比如说
m1 = (x1, y1, z1, ...)
m2 = (x2, y2, z2, ...)
在m1 和m2 内没有重复的坐标元组。每个meshgrid都有一个结果数组,可能是不同函数产生的:
r1 = f1(m1)
r2 = f2(m2)
这样f1(m) != f2(m)。现在我想加入这两个meshgrids 及其结果数组,例如m=m1&m2 和r=r1&r2(其中& 表示某种联合),这样m 中的坐标元组仍然是排序的,r 中的值仍然对应于原始坐标元组。新创建的坐标元组应该是可识别的(例如具有特殊值)。
为了详细说明我所追求的,我有两个例子可以用简单的for 和if 语句来做我想做的事。这是一个 1D 示例:
x1 = [1, 5, 7]
r1 = [i**2 for i in x1]
x2 = [2, 4, 6]
r2 = [i*3 for i in x2]
x,r = list(zip(*sorted([(i,j) for i,j in zip(x1+x2,r1+r2)],key=lambda x: x[0])))
给了
x = (1, 2, 4, 5, 6, 7)
r = (1, 6, 12, 25, 18, 49)
对于 2D,它开始变得相当复杂:
import numpy as np
a1 = [1, 5, 7]
b1 = [2, 5, 6]
x1,y1 = np.meshgrid(a1,b1)
r1 = x1*y1
a2 = [2, 4, 6]
b2 = [1, 3, 8]
x2, y2 = np.meshgrid(a2,b2)
r2 = 2*x2
a = [1, 2, 4, 5, 6, 7]
b = [1, 2, 3, 5, 6, 8]
x,y = np.meshgrid(a,b)
r = np.ones(x.shape)*-1
for i in range(x.shape[0]):
for j in range(x.shape[1]):
if x[i,j] in a1 and y[i,j] in b1:
r[i,j] = r1[a1.index(x[i,j]),b1.index(y[i,j])]
elif x[i,j] in a2 and y[i,j] in b2:
r[i,j] = r2[a2.index(x[i,j]),b2.index(y[i,j])]
这给出了所需的结果,新坐标对的值为-1:
x=
[[1 2 4 5 6 7]
[1 2 4 5 6 7]
[1 2 4 5 6 7]
[1 2 4 5 6 7]
[1 2 4 5 6 7]
[1 2 4 5 6 7]]
y=
[[1 1 1 1 1 1]
[2 2 2 2 2 2]
[3 3 3 3 3 3]
[5 5 5 5 5 5]
[6 6 6 6 6 6]
[8 8 8 8 8 8]]
r=
[[ -1. 4. 4. -1. 4. -1.]
[ 2. -1. -1. 5. -1. 6.]
[ -1. 8. 8. -1. 8. -1.]
[ 10. -1. -1. 25. -1. 30.]
[ 14. -1. -1. 35. -1. 42.]
[ -1. 12. 12. -1. 12. -1.]]
但是随着维度和数组大小的增加,这也会很快变慢。所以最后的问题是:如何仅使用numpy 函数来完成。如果不可能,在python 中实现此功能的最快方法是什么。如果无论如何相关,我更喜欢使用 Python 3。请注意,我在示例中使用的函数并不是我实际使用的函数。
【问题讨论】:
标签: python arrays sorting numpy