是否有一种简单的方法来获取一个三维数据的numpy数组,并将其拆分为八进制,或者更精细的分辨率。所以有了数据,比如
[[0,0,0], [1,0,0], [2,0,0], [3,0,0], [0,1,0], [0,2,0], [0,3,0] ...]我要在2,2,2架飞机上分成8个阵列。因此,第一个子数组的值为x< 2,y< 2,z< 2,第二次x >= 2&x< 4,y< 2,z<2等等,最后我需要进一步深入,递归地将每个子数组分割成更多的立方体。
有比循环数据更好的方法吗?
发布于 2015-02-15 11:57:13
你只需使用过滤器..。
filter(lambda m: all([m[0]<2, m[1]<2, m[2]<2]), xs)得到你的第一个象限..。
现在,由于平面是定义的,条件是简单地>2,<=2迭代分裂将是有趣的。假设,您创建了一个函数,该函数获取一个点的列表,并根据所提供的特定条件将它们拆分.
def fn1(pts , condition):
return [ filter( lambda m: condition(m), pts), filter( lambda m: not condition(m), pts) ]那么,如果你提供了一个条件,可以沿着特定的飞机分裂.
In [11]: fn1(xs, lambda m: m[0]<2)
Out[11]:
[[[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 2, 0], [0, 3, 0]],
[[2, 0, 0], [3, 0, 0]]]您想要的不是这个,而是一个函数,它接受列表并按照指定的标准进行拆分,然后返回另一个列表列表.
def fn2(ptss, condition):
return reduce(lambda m,n: m+n, map(lambda m: fn1(m, condition), ptss))
In [15]: fn2( [ xs ] , lambda m: m[0]<2)
Out[15]:
[[[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 2, 0], [0, 3, 0]],
[[2, 0, 0], [3, 0, 0]]]但是,你说,这是完全一样的事情!不完全是。现在,您可以提供一个新生成的列表并获得另一个列表。如果您还没有遇到这种情况,那么它就是所谓的map-还原,它在函数式编程和大数据中都被大量使用。
xx = [xs]
xx = fn2(xx, lambda m: m[0]<2)
xx = fn2(xx, lambda m: m[1]<2)
xx = fn2(xx, lambda m: m[2]<2)
In [21]: xx
Out[21]:
[[[0, 0, 0], [1, 0, 0], [0, 1, 0]],
[],
[[0, 2, 0], [0, 3, 0]],
[],
[[2, 0, 0], [3, 0, 0]],
[],
[],
[]]正如您将看到的那样,函数fn2允许您将前一个输出的结果直接链接到您的下一个输出,并将结果链接到同一个函数。还请记住,Python中的函数是一流的值,您可以有一个函数列表.
funcList = [lambda m: m[0] < 2,
lambda m: m[1] < 2,
lambda m: m[2] < 2]我会把你留在这里,想出一种优雅的方法,用函数列表来进行链接.
发布于 2015-02-15 17:56:16
对于二进制分裂的情况:
def binary_split(data):
half_dims = [s/2 for s in data.shape]
return np.array([data[s] for s in itertools.product(*[(slice(0, h), slice(h, 2*h)) for h in half_dims])]).reshape([2]*data.ndim+half_dims)希望这已经够神秘了。
https://stackoverflow.com/questions/28525281
复制相似问题