Numpy数组获取不是NaN的数组的子集/切片

时间:2013-06-15 18:15:27

标签: python arrays python-2.7 numpy slice

我有一个大小的数组:(50,50)。在这个数组中有一个大小的片(20,10)。 只有这个切片包含数据,余数全部设置为nan。

如何从我的大阵列中切出这个切片?

2 个答案:

答案 0 :(得分:3)

您可以使用精美的索引来收集not NaN的项目:

a = a[ np.logical_not( np.isnan(a) ) ].reshape(20,10)

或者,正如Joe Kington所建议的那样:

a = a[ ~np.isnan(a) ]

答案 1 :(得分:1)

你知道NaNs在哪里吗?如果是这样,这样的事情应该有效:

newarray = np.copy(oldarray[xstart:xend,ystart:yend])

其中xstartxend是x维中所需切片的开头和结尾,y类似。然后,如果您不再需要,可以删除旧数组以释放内存。

如果您不知道NaN在哪里,这应该可以解决问题:

# in this example, the starting array is A, numpy is imported as np
boolA = np.isnan(A) #get a boolean array of where the nans are
nonnanidxs = zip(*np.where(boolA == False)) #all the indices which are non NaN
#slice out the nans
corner1 = nonnanidxs[0]
corner2 = nonnanidxs[-1]
xdist = corner2[0] - corner1[0] + 1
ydist = corner2[1] - corner1[1] + 1
B = copy(A[corner1[0]:corner1[0]+xdist,corner1[1]:corner1[1]+ydist])
#B is now the array you want

请注意,对于大型数组来说这会非常慢,因为np.where会查看整个数组。数字错误跟踪器中有一个未解决的问题,即找到第一个索引等于某个值然后停止的方法。可能有更优雅的方式来实现这一点,这只是我头脑中的第一件事。

编辑:忽略,sgpc的答案要好得多。