Python 不使用numpy创建多维数组的好方法

Python 不使用numpy创建多维数组的好方法,python,arrays,Python,Arrays,我需要一些方法来跟踪布尔标志的四维数组。只有真/假值。看起来numpy是做这类事情的标准方式,但它的安装似乎比我真正想要处理的要复杂得多。(我需要在多个操作系统环境中工作。) 那么,有没有一种简单的方法,或者说是一个简单的模块,可以让我从一个四维数组中存储和获取真/假值,而不用把自己挖到比海洋更深的一堆意大利面条 我可以创建列表列表列表,但这似乎相当笨拙。您可以使用python列表代替numpy数组来生成多维数组 比如: values = [[[[True, False, False], [Fa

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

那么,有没有一种简单的方法,或者说是一个简单的模块,可以让我从一个四维数组中存储和获取真/假值,而不用把自己挖到比海洋更深的一堆意大利面条


我可以创建列表列表列表,但这似乎相当笨拙。

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

比如:

values = [[[[True, False, False], [False, False, False], ...]]]
您将使用numpy阵列的其他哪些功能?如果您需要很多,那么在大多数平台上安装应该很简单。大多数Linux发行版的软件包管理方案中都有它,windows上有一个“next,next,next,install”安装程序,您可以使用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]
来转换输出形状。当然,这只会得到“空”数组。

如果您只想存储和获取一个四维对象,可以使用dict:

In [7]: x = {}

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

# get
In [9]: x[1,2,3,4]
Out[9]: True
如果数组稀疏(罕见的真值);您可以使用:

从集合导入defaultdict
def品牌(深度):
如果深度大于1,则返回defaultdict(lambda:make(depth-1)),否则返回False
>>>d=defaultdict(lambda:make(4))
>>>d[1][2][3][4]=正确
>>>d[1][2][3][4]
真的
>>>d[1][2][3][2]
假的
>>>d[1][2][3]
defaultdict(,{2:False,4:True})

这基本上就是我试图避免的挂载意大利面。如何将数据加载到阵列中?windows安装程序仅在32位windows上工作。据我所知,我只需要设置、取消设置和获取标志。(所以numpy可能是严重的过度使用。)它也应该在64位windows上工作,但我相信它需要安装32位Python。这通常意味着相同的事情。不幸的是,我需要一次加载一个数组值。我的数据集似乎完全没有从一个值到另一个值的关联。是的。如果我必须自己实现,我可能会在
字节数组
--覆盖
\uuuuuu setitem\uuuuuuuuuuuuu
\uuuuuuu getitem\uuuuuuuuuuuuuuuuu
周围创建一个类包装器,以指向正确的位置。当然,如果您想支持切片等,这会变得更复杂。不过,我想最终还是使用
numpy
;-)你需要什么操作?你能用4元组密钥的dict吗?你知道,安装numpy其实并不难…你知道安装numpy真的很难。在64位Windows上。这是如此简单,但令人敬畏。
from collections import defaultdict

a = defaultdict(bool)
a[i,j,k,m] = 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})