python – 无法使用numpy为’double slice’赋值
发布时间:2020-12-20 11:48:24 所属栏目:Python 来源:网络整理
导读:如何在numpy中执行以下操作? 选择包含超过50%0值的数组的所有行. 从满足1的所有行中选择第一个n(比如说2个)行. 执行某些操作并将修改后的行放在零数组的相同索引上,其形状等于1. 以下结果导致数组中没有分配新值: In [177]: a = np.array([[0,3],[4,5,6],
如何在numpy中执行以下操作?
>选择包含超过50%0值的数组的所有行. 以下结果导致数组中没有分配新值: In [177]: a = np.array([[0,3],[4,5,6],[7,0],[10,11,12],[13,14,15]]) b = np.zeros_like(a) a Out[177]: array([[ 0,[ 4,[ 7,15]]) In [178]: # select all rows containg note more than 50% 0 values percent = np.sum(a == 0,axis=-1) / float(check.shape[1]) percent = percent >= 0.5 slice = np.invert(percent).nonzero()[0] In [183]: # select first two rows satisfying 'slice' a[slice][0:2] Out[183]: array([[ 4,12]]) In [182]: # do something and place modified rows on same index of zero array b[slice][0:2] = a[slice][0:2] * 2 In [184]: b Out[184]: array([[0,[0,0]]) 解决方法
问题是b [slice]创建了一个副本而不是一个视图(它触发了花式索引).代码b [slice] [0:2]创建此副本的视图(不是原始b!).因此…
b[slice][0:2] = a[slice][0:2] * 2 …将相应的a行分配给b的副本视图. 因为它可能导致这些情况,所以最好不要以这种方式链接索引操作.相反,只需先计算切片的相关行数,然后执行赋值: slice = np.invert(percent).nonzero()[0][:2] # first two rows b[slice] = a[slice] * 2 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |