如何按值删除二维 NumPy 数组中的特定数组?
How to delete particular array in 2 dimensional NumPy array by value?
设二维数组如下:
In [1]: a = [[1, 2], [3, 4], [5, 6], [1, 2], [7, 8]]
a = np.array(a)
a, type(a)
Out [1]: (array([[1, 2],
[3, 4],
[5, 6],
[1, 2],
[7, 8]]),
numpy.ndarray)
我试过这个程序:
In [2]: a = a[a != [1, 2])
a = np.reshape(a, (int(a.size/2), 2) # I have to do this since on the first line in In [2] change the dimension to 1 [3, 4, 5, 6, 7, 8] (the initial array is 2-dimensional array)
a
Out[2]: array([[3, 4],
[5, 6],
[7, 8]])
我的问题是,NumPy 中是否有任何函数可以直接执行此操作?
更新问题
这是我一直在研究的半完整源代码:
from sklearn import datasets
data = datasets.load_iris()
df = pd.DataFrame(data.data, columns=data.feature_names)
df['Target'] = pd.DataFrame(data.target)
bucket = df[df['Target'] == 0]
bucket = bucket.iloc[:,[0,1]].values
lp, rp = leftestRightest(bucket)
bucket = np.array([x for x in bucket if list(x) != lp])
bucket = np.array([x for x in bucket if list(x) != rp])
备注:
leftestRightest(arg)
是 returns 2 个大小为 2 的一维 NumPy 数组(即 lp
和 rp
)的函数。例如,lp = [1, 3]
、rp = [2, 4]
,参数为二维 NumPy 数组
应该有一个更微妙的方法,但这里是我想出的:
np.array([x for x in a if list(x) != [1,2]])
输出
[[3, 4], [5, 6], [7, 8]]
请注意,我不建议在大型数组中使用列表理解,因为它会非常 time-consuming。
您的方法是正确的,但掩码需要 single-dimensional:
a[(a != [1, 2]).all(-1)]
输出:
array([[3, 4],
[5, 6],
[7, 8]])
或者,您可以收集元素并使用 -1 推断维度:[=13=]
a[a != [1, 2]].reshape(-1, 2)
布尔条件创建 True/False 的二维数组。您必须对列应用 and
操作以确保匹配不是部分匹配。考虑上面数组中的一行 [5,2],您编写的脚本将在生成的一维数组中添加 5 并忽略 2。可以这样操作:
a[np.all(a != [1, 2],axis=1)]
设二维数组如下:
In [1]: a = [[1, 2], [3, 4], [5, 6], [1, 2], [7, 8]]
a = np.array(a)
a, type(a)
Out [1]: (array([[1, 2],
[3, 4],
[5, 6],
[1, 2],
[7, 8]]),
numpy.ndarray)
我试过这个程序:
In [2]: a = a[a != [1, 2])
a = np.reshape(a, (int(a.size/2), 2) # I have to do this since on the first line in In [2] change the dimension to 1 [3, 4, 5, 6, 7, 8] (the initial array is 2-dimensional array)
a
Out[2]: array([[3, 4],
[5, 6],
[7, 8]])
我的问题是,NumPy 中是否有任何函数可以直接执行此操作?
更新问题
这是我一直在研究的半完整源代码:
from sklearn import datasets
data = datasets.load_iris()
df = pd.DataFrame(data.data, columns=data.feature_names)
df['Target'] = pd.DataFrame(data.target)
bucket = df[df['Target'] == 0]
bucket = bucket.iloc[:,[0,1]].values
lp, rp = leftestRightest(bucket)
bucket = np.array([x for x in bucket if list(x) != lp])
bucket = np.array([x for x in bucket if list(x) != rp])
备注:
leftestRightest(arg)
是 returns 2 个大小为 2 的一维 NumPy 数组(即 lp
和 rp
)的函数。例如,lp = [1, 3]
、rp = [2, 4]
,参数为二维 NumPy 数组
应该有一个更微妙的方法,但这里是我想出的:
np.array([x for x in a if list(x) != [1,2]])
输出
[[3, 4], [5, 6], [7, 8]]
请注意,我不建议在大型数组中使用列表理解,因为它会非常 time-consuming。
您的方法是正确的,但掩码需要 single-dimensional:
a[(a != [1, 2]).all(-1)]
输出:
array([[3, 4],
[5, 6],
[7, 8]])
或者,您可以收集元素并使用 -1 推断维度:[=13=]
a[a != [1, 2]].reshape(-1, 2)
布尔条件创建 True/False 的二维数组。您必须对列应用 and
操作以确保匹配不是部分匹配。考虑上面数组中的一行 [5,2],您编写的脚本将在生成的一维数组中添加 5 并忽略 2。可以这样操作:
a[np.all(a != [1, 2],axis=1)]