我有一个numpy矩阵,其中一行例如如下所示:
|0 1 2 3 4 5 6 7 8|
我可以得到一个阵列的某个部分,例如。我需要使用numpy切片[3,4,5]
来实现一个目的a[0,3:6]
。
有什么内置的东西可以让我也得到不在那个范围内的所有东西吗?与[0,1,2,6,7,8]
答案 0 :(得分:3)
使用boolean indexing
-
a[~np.in1d(np.arange(a.size),r)]
示例运行 -
In [174]: a
Out[174]: array([10, 11, 12, 13, 14, 15, 16, 17, 18])
In [175]: r
Out[175]: [3, 4, 5]
In [176]: a[~np.in1d(np.arange(a.size),r)] # Without r
Out[176]: array([10, 11, 12, 16, 17, 18])
In [177]: a[r] # With r
Out[177]: array([13, 14, 15])
a[np.setdiff1d(np.arange(a.size),r)]
另一种方法是连接原始切片两侧的切片 -
np.concatenate((a[:r[0]], a[r[-1]+1:]))
答案 1 :(得分:2)
你的问题和例子中存在一些含糊之处。您是按价值还是索引选择元素?我们应该从字面上理解slice
吗?
从字面上理解slice
:
In [10]: x=np.arange(10) # stick with the ambiguous input for now
In [11]: x[3:6]
Out[11]: array([3, 4, 5])
如果按位置选择元素, np.delete
是一个方便的工具。这是一般目的,可以使用slice
以及list
输入:
In [13]: np.delete(x,slice(3,6))
Out[13]: array([0, 1, 2, 6, 7, 8, 9])
In [14]: np.delete(x,[3,4,5])
Out[14]: array([0, 1, 2, 6, 7, 8, 9])
如果您想按值选择元素, np.in1d
非常有用。
布尔遮罩也是一个很好的知识和使用工具。
delete
根据输入使用不同的方法。对于一个简单的切片,我相信它使用相当于:
In [15]: np.concatenate((x[:3],x[6:]))
Out[15]: array([0, 1, 2, 6, 7, 8, 9])