我需要一些方法来跟踪布尔标志的四维数组。只是真/假值。似乎 numpy 是执行此类操作的规范方式,但安装起来似乎比我真正想要处理的要复杂得多。(我需要在多个操作系统环境中工作。)
那么,有没有一种简单的方法或简单的模块,可以让我从一个四维数组中存储和获取真/假值,而不用给自己挖一堆比海洋更深的意大利面?
我可以做一个列表列表列表的列表,但这似乎相当笨拙。
如果您只想存储和获取 4 维对象,则可以使用 dict:
In [7]: x = {}
# store
In [8]: x[1,2,3,4] = True
# get
In [9]: x[1,2,3,4]
Out[9]: True
如果数组是稀疏的(罕见的 True 值);你可以使用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
...
像这样的东西怎么样
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]
转置输出形状。当然,这只会让你得到“空”数组。
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})