从2d numpy数组的每一行中删除指定的列索引

时间:2019-09-24 12:01:09

标签: numpy

我有一个如下的numpy数组A:

 while (dr.Read())
    {
        try
        {
            getImg = (byte[])dr["Photograph"];
            personId = Convert.ToString(dr["person_id"]);
            MemoryStream str = new MemoryStream(getImg);
            using (Bitmap bitmap = new Bitmap(Image.FromStream(str))) {
                BitmapImg = ImageToByte(bitmap);
                dt.Rows.Add(personId, bitmap);
           }
        }
        catch (Exception ex)
        {

            LogWriter.WriteLine(personId + ex.Message.ToString());
        }
    }

和另一个numpy数组column_indices_to_be_deleted如下:

array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

我想从column_indices_to_be_deleted中的列索引指定的A的每一行中删除该元素。因此,在这种情况下,第0行的列索引1,第1行的列索引0和第2行的列索引2,将得到一个新的数组,如下所示:

array([1, 0, 2])

最简单的方法是什么?

1 个答案:

答案 0 :(得分:2)

使用masking创建的broadcatsed-comparison的一种方法-

In [43]: a # input array
Out[43]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

In [44]: remove_idx # indices to be removed from each row
Out[44]: array([1, 0, 2])

In [45]: n = a.shape[1]

In [46]: a[remove_idx[:,None]!=np.arange(n)].reshape(-1,n-1)
Out[46]: 
array([[1, 3],
       [5, 6],
       [7, 8]])

另一种基于mask的方法,其中使用array-assignment创建的掩码-

In [47]: mask = np.ones(a.shape,dtype=bool)

In [48]: mask[np.arange(len(remove_idx)), remove_idx] = 0

In [49]: a[mask].reshape(-1,a.shape[1]-1)
Out[49]: 
array([[1, 3],
       [5, 6],
       [7, 8]])

另一个与np.delete-

In [64]: m,n = a.shape

In [66]: np.delete(a.flat,remove_idx+n*np.arange(m)).reshape(m,-1)
Out[66]: 
array([[1, 3],
       [5, 6],
       [7, 8]])