如何在不使用for循环的情况下从数组列表中删除元素

时间:2019-08-18 20:22:41

标签: python python-3.x numpy

我有此代码:

portes = [[0, 1, 2]] * 20
bonnes_portes = np.random.choice(range(3), size=(1, 20))
premier_choix = np.random.choice(range(3), size=(1, 20))
print(portes)
print(premier_choix)

此输出:

[[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]

[[1 1 1 2 2 1 1 2 2 1 0 0 1 2 0 0 1 2 1 2]]

我想从premier_choix列表中依次删除portes列表中的每个元素(从premier_choix[0][0]中删除portes[0][0] ...)不使用 for循环。

3 个答案:

答案 0 :(得分:1)

您可以使用np.argwhere参数来获取相关的索引,然后对数组使用切片操作并将其重新整形为所需的形式。

portes_arr = np.array(portes)
idx = np.argwhere(portes_arr != np.array(premier_choix).reshape(20,1))
portes_arr[idx[:,0], idx[:,1]].reshape(20,2)

(示例)输入

premier_choix
array([[2, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 2, 1, 0, 1, 2, 2, 2, 1, 1]])

输出

portes_arr[idx[:,0], idx[:,1]].reshape(20,2)

array([[0, 1],
       [0, 2],
       [1, 2],
       [0, 2],
       [0, 2],
       [0, 1],
       [0, 1],
       [0, 2],
       [0, 2],
       [0, 2],
       [0, 2],
       [0, 1],
       [0, 2],
       [1, 2],
       [0, 2],
       [0, 1],
       [0, 1],
       [0, 1],
       [0, 2],
       [0, 2]])

答案 1 :(得分:1)

我假设总是有一个要删除的元素(就像上面的示例一样)。输入:

# Import
import numpy as np

# Input
portes = [[0, 1, 2]] * 20
premier_choix = np.random.choice(range(3), size=(1, 20))

# Modify input (or start with it)
portes = np.array(portes)
premier_choix = premier_choix.reshape(-1, 1)

矢量化解决方案:

output = portes[portes != premier_choix].reshape(-1, 2)
print(output)

答案 2 :(得分:0)

您可以使用.remove()完全删除列表