好的方法来制作一个没有numpy的多维数组

问题描述:

我需要一些方法来跟踪布尔标志的四维数组。只是真/假值。看起来numpy是做这种事情的标准方式,但安装起来似乎比我想要处理的要复杂得多。 (我需要在多个操作系统环境中工作)。好的方法来制作一个没有numpy的多维数组

那么,有没有一种简单的方法,或简单的模块,可以让我从四维数组存储和获取True/False值,而无需挖掘自己的意大利面条堆比海洋还深?

我可以做列表清单列表,但似乎相当笨拙。

+0

如果我有* *实现这一点我自己,我可能会围绕一个'bytearray'创建一个类包装 - 覆盖'__setitem__'和'__getitem__'指向正确位置。当然,如果你想支持切片等,这会变得更加复杂 - 最终,我认为我只是使用'numpy' ;-) – mgilson 2013-02-19 14:25:33

+0

你需要什么操作?你可以用四元组键的字典逃脱吗? – DSM 2013-02-19 14:26:06

+0

你知道,安装numpy并不难...... – wim 2013-02-19 14:31:29

如果数组是稀疏的(罕见的真值);你可以使用collections.defaultdict

from collections import defaultdict 

a = defaultdict(bool) 
a[i,j,k,m] = True 

您可以使用python列表代替numpy数组来生成多维数组。

喜欢的东西:

values = [[[[True, False, False], [False, False, False], ...]]] 

你会使用什么numpy的阵列的其他功能?如果你需要安装很多平台,应该很简单。大多数Linux发行版在它们的软件包管理方案中都有,它有一个用于Windows的“下一个,下一个,下一个,安装”安装程序,您可以使用PIP或类似软件在OS X上安装。

正如其他人所建议的替代是使用dict,或可能defaultdict和索引,它与一个元组:

values = {} 

values[1, 2, 3, 4] = True 
... 
+0

这基本上是我尝试避免的意大利面。 – 2013-02-19 14:24:07

+0

你如何将数据加载到数组中? – Will 2013-02-19 14:25:58

+0

窗口的安装程序仅适用于32位窗口。 只要我能预测,我只需要设置,取消设置并获取标志。 (所以numpy可能是严重的矫枉过正) – 2013-02-19 14:26:30

如何像

def make_array(shape): 
    data = False 
    while len(shape) > 0: 
     data = [data for x in range(shape[-1])] 
     shape.pop() 
    return data 



>>> make_array([3,4,5]) 
[[[False, False, False, False, False], [False, False, False, False, False], [False, False, False, False 
, False], [False, False, False, False, False]], [[False, False, False, False, False], [False, False, Fa 
lse, False, False], [False, False, False, False, False], [False, False, False, False, False]], [[False, 
False, False, False, False], [False, False, False, False, False], [False, False, False, False, False], 
[False, False, False, False, False]]] 
>>> 

你可以做shape[0]转置输出的形状。当然,这只是让你成为“空”的阵列。

如果你想要的是存储并从4维对象获取,或者用一个字典:

In [7]: x = {} 

# store 
In [8]: x[1,2,3,4] = True 

# get 
In [9]: x[1,2,3,4] 
Out[9]: True 

from collections import defaultdict 
def make(depth): 
    return defaultdict(lambda: make(depth - 1)) if depth > 1 else False 

>>> d = defaultdict(lambda: make(4))  
>>> d[1][2][3][4] = True 
>>> d[1][2][3][4] 
True 
>>> d[1][2][3][2] 
False 
>>> d[1][2][3] 
defaultdict(<function <lambda> at 0x10d08d488>, {2: False, 4: True})