从numpy数组对应的列表中删除元素

时间:2017-06-23 14:12:00

标签: python numpy matplotlib

我有三个V个整数列表,以及一个3d numpy数组(x[0], y[0], z[0]),它包含每个点的值。例如,点V[x[0], y[0], z[0]]的值为plt.scatter(xs, ys, zs, c=V)。我使用这些来创建三维散点图0.2

我想只绘制V中值至少为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) 变为正确的形状?

编辑:这是一种蛮力的方式:

$(function(){
   
  $("input[name=myList]").on("click",function(){
    var uncheck=[];
    //console.log("triggered");
    //code here to find which ones are unchecked

  
  $boxes = $("input[name=myList]:not(:checked)");
  $boxes.each(function(){
    // Do stuff with for each unchecked box
    uncheck.push($(this).attr('value'))
    console.log(uncheck);
  });
  });
});

1 个答案:

答案 0 :(得分:0)

在最好的情况下,数组V是有序的,当它被展平时,索引i的值对应i中的x,y,z值。如果是这种情况,您可以按条件过滤相应的数组:

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()

enter image description here