有一个像:
这样的数组array([
[[X1, Y1, 80, 13, 14],
[17, 54, 47, 67, 45],
[11, 21, 67, 45, 11],
[15, 75, 17, 69, 12]],
[[X2, Y2, 94, 51, 10],
[64, 81, 90, 80, 67],
[78, 73, 19, 6, 57],
[46, 18, 83, 26, 56]],
...
[[Xn, Yn, 32, 3, 82],
[47, 69, 63, 20, 10],
[16, 48, 7, 96, 11],
[95, 30, 45, 65, 42]] ])
目标是按每个X和Y分组,然后检查每个组中的条件。 要做到这一点我写代码:
x=npy.random.randint(100,size=(5,4,5))
array([[[36, 47, 80, 13, 14],
[17, 54, 47, 67, 45],
[11, 21, 67, 45, 11],
[15, 75, 17, 69, 12]],
[[50, 17, 94, 51, 10],
[64, 81, 90, 80, 67],
[78, 73, 19, 6, 57],
[46, 18, 83, 26, 56]],
[[37, 98, 32, 3, 82],
[47, 69, 63, 20, 10],
[16, 48, 7, 96, 11],
[95, 30, 45, 65, 42]],
[[59, 36, 38, 95, 3],
[67, 62, 61, 64, 15],
[49, 45, 24, 85, 24],
[23, 89, 23, 63, 14]],
[[49, 26, 70, 83, 99],
[16, 94, 78, 43, 33],
[95, 4, 39, 91, 56],
[94, 26, 71, 32, 55]]])
for i in range(x.shape[1]):
for j in range(x.shape[2]):
npy.any(x[0:3,i,j]>80)
False
True
True
False
True
False
True
True
False
False
False
False
False
True
False
True
False
True
False
False
但因为我使用的数组很大,这种方式对我来说效率不高。 有没有更好的写作方式?是否可以删除for循环?什么是最快的方式?
答案 0 :(得分:4)
IIUC你可以简单地沿第一轴切割前三个元素,与阈值进行比较,然后沿第一轴寻找ANY
匹配 -
(x[0:3] > 80).any(axis=0)
答案 1 :(得分:0)
如果您打算做很多小组(即n
与小组相比较大),您甚至可以使用logical_or.reduceat
一次完成所有小组:
def groupSearch(x, groupSize, c = lambda y: y > 80, axis = 0):
slices = np.arange(0 , x.shape[axis] , groupSize)
return np.logical_or.reduceat(c(x), slices, axis)