Python 从对应于numpy数组的列表中删除元素
我有三个整数列表,以及一个3d numpy数组,其中包含每个点的值。例如,点Python 从对应于numpy数组的列表中删除元素,python,numpy,matplotlib,Python,Numpy,Matplotlib,我有三个整数列表,以及一个3d numpy数组,其中包含每个点的值。例如,点(x[0],y[0],z[0])的值是V[x[0],y[0],z[0]]。我用这些来创建一个3d散点图plt.scatter(xs,ys,zs,c=V) 我只想在V中绘制值至少为0.2的点。如何从xs、ys、zs中删除正确的元素,并将V变成正确的形状 编辑:以下是一种暴力方式: xg = [] yg = [] zg = [] Vg = [] for x in xs: for y in ys: fo
(x[0],y[0],z[0])
的值是V[x[0],y[0],z[0]]
。我用这些来创建一个3d散点图plt.scatter(xs,ys,zs,c=V)
我只想在V
中绘制值至少为0.2
的点。如何从xs、ys、zs
中删除正确的元素,并将V
变成正确的形状
编辑:以下是一种暴力方式:
xg = []
yg = []
zg = []
Vg = []
for x in xs:
for y in ys:
for z in zs:
if V[x,y,z] > 0.2:
xg.append(x)
yg.append(y)
zg.append(z)
Vg.append(V[x,y,z])
ax.scatter(xg, yg, zg, c=Vg)
在最佳情况下,数组
V
的排列顺序应确保当其展平时,索引i
处的值对应于x,y,z
中的i
第th个值。如果是这种情况,您可以根据以下条件筛选相应的阵列:
X = np.array(xs); Y = np.array(ys); Z=np.array(zs)
X = X[V>0.2]
Y = Y[V>0.2]
Z = Z[V>0.2]
V = V[V>0.2]
plt.scatter(X,Y,Z, c=V)
如果x,y,z
实际上没有定义网格,我们需要首先定义该网格
Y,X,Z = np.meshgrid(xs,ys,zs)
X = X[V>0.2]
Y = Y[V>0.2]
Z = Z[V>0.2]
V = V[V>0.2]
ax2.scatter(X, Y, Z, c=V)
一个完整的示例,将问题中的方法与此方法进行比较:
import numpy as np
V = np.arange(27).reshape((3,3,3))/35.
xs = np.arange(3)
ys = np.arange(3)
zs = np.arange(3)
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(121, projection='3d')
ax2 = fig.add_subplot(122, projection='3d')
# solution from the question
xg = []
yg = []
zg = []
Vg = []
for x in xs:
for y in ys:
for z in zs:
if V[x,y,z] > 0.2:
xg.append(x)
yg.append(y)
zg.append(z)
Vg.append(V[x,y,z])
ax.scatter(xg, yg, zg, c=Vg)
# numpy solution
Y,X,Z = np.meshgrid(xs,ys,zs)
X = X[V>0.2]
Y = Y[V>0.2]
Z = Z[V>0.2]
V = V[V>0.2]
ax2.scatter(X, Y, Z, c=V)
plt.show()
您需要添加一些代码。但是
V
不是1d arry afaik。这是一个3d阵列x
、y
和z
包含映射到V上的索引。当然,从V中的值顺序的问题来看,这并不清楚。但我们确实知道,因为plt.scatter(xs,ys,zs,c=V)
在没有过滤的情况下给出了正确的图,所以上述解决方案也应该起作用。