选择所有行,但选择numpy数组范围内的行

时间:2014-11-26 03:22:09

标签: python arrays numpy indexing

我有一个矩阵,我想迭代它的块。每次迭代我都要抓住那个块,而不是那个块中的一切。例如

#grab all rows between index1 and index2
chunk = arr[index1:index2, :]

#want to grab the rest of the matrix that wasn't already grabbed in chunk
#this is the wrong syntax but demonstrates the behavior I'm looking for
rest = arr[ not(index1:index2), :] 

有什么好方法吗?

2 个答案:

答案 0 :(得分:0)

一种方法是vstack 2件:

In [68]: arr
Out[68]: 
array([[ 0,  5, 10, 15],
       [ 1,  6, 11, 16],
       [ 2,  7, 12, 17],
       [ 3,  8, 13, 18],
       [ 4,  9, 14, 19]])

In [69]: arr[2:4,:]
Out[69]: 
array([[ 2,  7, 12, 17],
       [ 3,  8, 13, 18]])

In [70]: np.vstack([arr[:2,:],arr[4:,:]])
Out[70]: 
array([[ 0,  5, 10, 15],
       [ 1,  6, 11, 16],
       [ 4,  9, 14, 19]])

或者您可以构建一个不连续的索引列表,例如[0,1,4]

arr[[0,1,4],:]

np.lib.index_tricks中有一个函数(实际上是类),它简化了构建这样一个列表的方法(来自列表或切片):

np.r_[:2,4:5]  # == np.array([0,1,4])

事实上,r_可以像vstack一样使用:

np.r_[arr[:2,:],arr[4:,:]]

通常你想根据某些条件划分数组,在这种情况下,布尔索引很有用:

I=np.ones(5,dtype=bool)
I[2:4]=False   # array True, with False for the rows to omit
arr[I,:]
arr[~I,:] # the original slice

答案 1 :(得分:-1)

如果你知道你不想索引1:index2 ..为什么不这样做?

rest=arr[index3:]