首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在numpy中将数据拆分为子多维数据集

在numpy中将数据拆分为子多维数据集
EN

Stack Overflow用户
提问于 2015-02-15 10:48:14
回答 2查看 673关注 0票数 0

是否有一种简单的方法来获取一个三维数据的numpy数组,并将其拆分为八进制,或者更精细的分辨率。所以有了数据,比如

代码语言:javascript
复制
[[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等等,最后我需要进一步深入,递归地将每个子数组分割成更多的立方体。

有比循环数据更好的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-15 11:57:13

你只需使用过滤器..。

代码语言:javascript
复制
filter(lambda m: all([m[0]<2, m[1]<2, m[2]<2]), xs)

得到你的第一个象限..。

现在,由于平面是定义的,条件是简单地>2,<=2迭代分裂将是有趣的。假设,您创建了一个函数,该函数获取一个点的列表,并根据所提供的特定条件将它们拆分.

代码语言:javascript
复制
def fn1(pts , condition): 
    return [ filter( lambda m: condition(m), pts),  filter( lambda m: not condition(m), pts)  ]

那么,如果你提供了一个条件,可以沿着特定的飞机分裂.

代码语言:javascript
复制
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]]]

您想要的不是这个,而是一个函数,它接受列表并按照指定的标准进行拆分,然后返回另一个列表列表.

代码语言:javascript
复制
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-还原,它在函数式编程和大数据中都被大量使用。

代码语言:javascript
复制
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中的函数是一流的值,您可以有一个函数列表.

代码语言:javascript
复制
funcList = [lambda m: m[0] < 2, 
            lambda m: m[1] < 2, 
            lambda m: m[2] < 2]

我会把你留在这里,想出一种优雅的方法,用函数列表来进行链接.

票数 1
EN

Stack Overflow用户

发布于 2015-02-15 17:56:16

对于二进制分裂的情况:

代码语言:javascript
复制
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)

希望这已经够神秘了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28525281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档