我有一个2D数组,称为X,X的类有一个1D数组,我想做的是为每个类切片相同数量的前N%元素,并存储在一个新的数组中,例如,以一种简单的方式,而不需要循环:
对于以下2D X阵列:
[[0.612515 0.385088 ]
[0.213345 0.174123 ]
[0.432596 0.8714246]
[0.700230 0.730789 ]
[0.455105 0.128509 ]
[0.518423 0.295175 ]
[0.659871 0.320614 ]
[0.459677 0.940614 ]
[0.823733 0.831789 ]
[0.236175 0.10750 ]
[0.379032 0.241121 ]
[0.512535 0.8522193]
输出为3。
然后,我想存储属于类0的前3个索引和属于类0和前3个元素,并保持索引的出现顺序,如下输出:
每个班级的前3名:[1 0 0 1 0 1]
New_X =
[[0.612515 0.385088 ]
[0.213345 0.174123 ]
[0.432596 0.8714246]
[0.700230 0.730789 ]
[0.455105 0.128509 ]
[0.518423 0.295175 ]]
首先,30%只是每个类中的2个元素(即使使用np.ceil
(。
其次,我假设两个数组都是numpy.array
。
给定2个数组,我们可以通过以下方式使用np.where
和数组y
找到所需的索引:
in_ = sorted([x for x in [*np.where(y==0)[0][:np.ceil(0.3*6).astype(int)],*np.where(y==1)[0][:np.ceil(0.3*6).astype(int)]]]) # [0, 1, 2, 3]
现在我们可以简单地将X
切片如下:
X[in_]
# array([[0.612515 , 0.385088 ],
# [0.213345 , 0.174123 ],
# [0.432596 , 0.8714246],
# [0.70023 , 0.730789 ]])
X
和y
的定义是:
X = np.array([[0.612515 , 0.385088 ],
[0.213345 , 0.174123 ],
[0.432596 , 0.8714246],
[0.70023 , 0.730789 ],
[0.455105 , 0.128509 ],
[0.518423 , 0.295175 ],
[0.659871 , 0.320614 ],
[0.459677 , 0.940614 ],
[0.823733 , 0.831789 ],
[0.236175 , 0.1075 ],
[0.379032 , 0.241121 ],
[0.512535 , 0.8522193]])
y = np.array([1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0])
编辑
以下行:np.where(y==0)[0][:np.ceil(0.3*6).astype(int)]
执行以下操作:
np.where(y==0)[0]
-返回y==0
所在的所有索引- 由于您只想要30%,我们对这些索引进行切片,以获得高达30%的所有值-
[:np.ceil(0.3*6).astype(int)]