我有两个numpy-arrays:
p_a_colors=np.array([[0,0,0],
[0,2,0],
[119,103,82],
[122,122,122],
[122,122,122],
[3,2,4]])
p_rem = np.array([[119,103,82],
[122,122,122]])
我想删除p_rem中p_a_colors中的所有列,所以我得到:
p_r_colors=np.array([[0,0,0],
[0,2,0],
[3,2,4]])
我认为,某些事情应该像
一样p_r_colors= np.delete(p_a_colors, np.where(np.all(p_a_colors==p_rem, axis=0)),0)
但我没有得到轴或[:]正确。
我知道,
p_r_colors=copy.deepcopy(p_a_colors)
for i in range(len(p_rem)):
p_r_colors= np.delete(p_r_colors, np.where(np.all(p_r_colors==p_rem[i], axis=-1)),0)
可以工作,但我试图避免(python)循环,因为我也希望性能正确。
答案 0 :(得分:7)
我就是这样做的:
dtype = np.dtype((np.void, (p_a_colors.shape[1] *
p_a_colors.dtype.itemsize)))
mask = np.in1d(p_a_colors.view(dtype), p_rem.view(dtype))
p_r_colors = p_a_colors[~mask]
>>> p_r_colors
array([[0, 0, 0],
[0, 2, 0],
[3, 2, 4]])
您需要执行void dtype事务,以便numpy将行作为一个整体进行比较。之后使用内置的设置例程似乎是显而易见的方法。
答案 1 :(得分:1)
这很难看,但是
tmp = reduce(lambda x, y: x | np.all(p_a_colors == y, axis=-1), p_rem, np.zeros(p_a_colors.shape[:1], dtype=np.bool))
indices = np.where(tmp)[0]
np.delete(p_a_colors, indices, axis=0)
(编辑:更正)
>>> tmp = reduce(lambda x, y: x | np.all(p_a_colors == y, axis=-1), p_rem, np.zeros(p_a_colors.shape[:1], dtype=np.bool))
>>>
>>> indices = np.where(tmp)[0]
>>>
>>> np.delete(p_a_colors, indices, axis=0)
array([[0, 0, 0],
[0, 2, 0],
[3, 2, 4]])
>>>
答案 2 :(得分:1)
您的指数错误。表达式p_a_colors==p_rem
计算为空数组,因为两个数组永远不相等(它们具有不同的形状!)。如果您想使用np.delete
,则需要更正确的索引列表。
另一方面,使用索引可以更容易地做到这一点:
>>> idx = np.array([p_a_colors[i] not in p_rem for i in
range(p_a_colors.shape[0])], dtype='bool')
>>> p_a_colors[idx]
array([[0, 0, 0],
[0, 2, 0],
[3, 2, 4]])
或者,受@Jaime建议的启发,你也可以用np.in1d
创建索引,在这里排成一行:
>>> idx = ~np.all(np.in1d(p_a_colors, p_rem).reshape(p_a_colors.shape),
axis=1)
>>> p_a_colors[idx]
array([[0, 0, 0],
[0, 2, 0],
[3, 2, 4]])
如果您必须使用np.delete
,只需将索引列表从bool
转换为序列:
>>> idx = np.array([p_a_colors[i] in p_rem for i in
range(p_a_colors.shape[0])])
>>> idx = np.arange(p_a_colors.shape[0])[idx]
>>> np.delete(p_a_colors, idx, axis=0)
array([[0, 0, 0],
[0, 2, 0],
[3, 2, 4]])