如何在numpy中执行以下操作?
>选择包含超过50%0值的数组的所有行.
>从满足1的所有行中选择第一个n(比如说2个)行.
>执行某些操作并将修改后的行放在零数组的相同索引上,其形状等于1.
以下结果导致数组中没有分配新值:
In [177]:
a = np.array([[0,0,3],[4,5,6],[7,0,0],[10,11,12],[13,14,15]])
b = np.zeros_like(a)
a
Out[177]:
array([[ 0, 0, 3],
[ 4, 5, 6],
[ 7, 0, 0],
[10, 11, 12],
[13, 14, 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, 5, 6],
[10, 11, 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],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[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