在 3D numpy 对象中查找对应于给定 z 值的 x 和 y 值
Finding x and y values corresponding to given z value in 3D numpy object
我在 Python (np
) 中有一个 numpy
对象,我正在用它在 pyplot
中绘制图表。
它是一个 3D 图形,其中 x
、y
和 z
是包含要绘制图形的值的列表。
下面是我的代码(来自 here):
data = np.c_[x,y,z]
# regular grid covering the domain of the data
mn = np.min(data, axis=0) - 0.009
mx = np.max(data, axis=0) + 0.009
X,Y = np.meshgrid(np.linspace(mn[0], mx[0]), np.linspace(mn[1], mx[1]))
XX = X.flatten()
YY = Y.flatten()
A = np.c_[np.ones(data.shape[0]), data[:, :2], np.prod(data[:, :2], axis=1), data[:, :2] ** 2]
C, _, _, _ = scipy.linalg.lstsq(A, data[:, 2])
# evaluate it on a grid
Z = np.dot(np.c_[np.ones(XX.shape), XX, YY, XX * YY, XX ** 2, YY ** 2], C).reshape(X.shape)
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, alpha=0.2)
ax.scatter(data[:, 0], data[:, 1], data[:, 2], c='r', s=50)
plt.xlabel('X')
plt.ylabel('Y')
ax.set_zlabel('Z')
ax.axis('equal')
ax.axis('tight')
plt.show()
所以在这里,我想得到x
和y
的值,其中z
的值最接近-30
。如何获得 x
和 y
.
的值
您可以 use np.where
获取满足条件 -30-eps < z < -30+eps
的指标,对于某些公差 eps
,并使用这些指标获取 x
和 y
,例如
eps = 10.
ind = np.where((-30+eps > Z.ravel()) & (Z.ravel() > -30-eps))
print("x=",X.ravel()[ind],"y=",Y.ravel()[ind])
我有点不确定在你的情况下如何做到这一点,因为你的情节与 link 中的示例值不同(请将有问题的代码设为 MCVE)。思路应该没问题。
您可以尝试关注(另请参阅 Find nearest value in numpy array)
value = 30.
zid = (np.abs(Z-value)).argmin()
xval = np.reshape(X, -1)[zid]
yval = np.reshape(Y, -1)[zid]
print xval, yval, np.reshape(Z, -1)[zid]
我已经根据您在问题中提到的示例 (https://gist.github.com/amroamroamro/1db8d69b4b65e8bc66a6) 进行了检查,它似乎有效。
我在 Python (np
) 中有一个 numpy
对象,我正在用它在 pyplot
中绘制图表。
它是一个 3D 图形,其中 x
、y
和 z
是包含要绘制图形的值的列表。
data = np.c_[x,y,z]
# regular grid covering the domain of the data
mn = np.min(data, axis=0) - 0.009
mx = np.max(data, axis=0) + 0.009
X,Y = np.meshgrid(np.linspace(mn[0], mx[0]), np.linspace(mn[1], mx[1]))
XX = X.flatten()
YY = Y.flatten()
A = np.c_[np.ones(data.shape[0]), data[:, :2], np.prod(data[:, :2], axis=1), data[:, :2] ** 2]
C, _, _, _ = scipy.linalg.lstsq(A, data[:, 2])
# evaluate it on a grid
Z = np.dot(np.c_[np.ones(XX.shape), XX, YY, XX * YY, XX ** 2, YY ** 2], C).reshape(X.shape)
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, alpha=0.2)
ax.scatter(data[:, 0], data[:, 1], data[:, 2], c='r', s=50)
plt.xlabel('X')
plt.ylabel('Y')
ax.set_zlabel('Z')
ax.axis('equal')
ax.axis('tight')
plt.show()
所以在这里,我想得到x
和y
的值,其中z
的值最接近-30
。如何获得 x
和 y
.
您可以 use np.where
获取满足条件 -30-eps < z < -30+eps
的指标,对于某些公差 eps
,并使用这些指标获取 x
和 y
,例如
eps = 10.
ind = np.where((-30+eps > Z.ravel()) & (Z.ravel() > -30-eps))
print("x=",X.ravel()[ind],"y=",Y.ravel()[ind])
我有点不确定在你的情况下如何做到这一点,因为你的情节与 link 中的示例值不同(请将有问题的代码设为 MCVE)。思路应该没问题。
您可以尝试关注(另请参阅 Find nearest value in numpy array)
value = 30.
zid = (np.abs(Z-value)).argmin()
xval = np.reshape(X, -1)[zid]
yval = np.reshape(Y, -1)[zid]
print xval, yval, np.reshape(Z, -1)[zid]
我已经根据您在问题中提到的示例 (https://gist.github.com/amroamroamro/1db8d69b4b65e8bc66a6) 进行了检查,它似乎有效。