如何对任意大小的数组进行切片



我有一个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 ]])

Xy的定义是:

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)]执行以下操作:

  1. np.where(y==0)[0]-返回y==0所在的所有索引
  2. 由于您只想要30%,我们对这些索引进行切片,以获得高达30%的所有值-[:np.ceil(0.3*6).astype(int)]

最新更新