我有一个如下的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])
最简单的方法是什么?
答案 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]])