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