【发布时间】:2016-04-18 06:38:47
【问题描述】:
我将如何在 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][0:2] = a[slice][0:2] * 2(请注意,RHS 我们现在索引的是a而不是b)。 -
无论如何,最好先定义
slice = np.invert(percent).nonzero()[0][:2],然后使用b[slice] = a[slice] * 2。 -
@ajcr 打错了,RHS 确实应该索引 'a'