【发布时间】:2018-07-24 12:31:12
【问题描述】:
我想在包含满足条件的所有值的 ndarray 中找到最小尺寸的二维 ndarray。
例如: 假设我有数组
x = np.array([[1, 1, 5, 3, 11, 1],
[1, 2, 15, 19, 21, 33],
[1, 8, 17, 22, 21, 31],
[3, 5, 6, 11, 23, 19]])
并致电f(x, x % 2 == 0)
那么程序的返回值就是数组
[[2, 15, 19]
[8, 17, 22]
[5, 6, 11]]
因为它是包含所有偶数的最小矩形数组(条件)。
我找到了一种方法来查找条件为真的所有索引,方法是使用np.argwhere,然后从原始数组中从最小索引切片到最大索引,我已经使用for loop 完成了它但我想知道是否有更有效的方法来使用 numpy 或 scipy。
我目前的方法:
def f(arr, cond_arr):
indices = np.argwhere(cond_arr)
min = np.amin(indices, axis = 0) #get first row, col meeting cond
max = np.amax(indices, axis = 0) #get last row, col meeting cond
return arr[min[0]:max[0] + 1, min[1] : max[1] + 1]
【问题讨论】:
-
在我看来,您的功能已经非常高效了。对您的需求来说太慢了吗?
-
它适用于我的数据,我只是想知道是否有更好的方法,旧的 kolmogorov 复杂性问题。 Numpy 进行了很好的优化,但在我可以应用高级索引之前,我必须对完整的数组比较进行 3 次调用。我觉得可能有一个函数可以在数组的一次传递中同时找到最小和最大索引。