2013-02-19 41 views
2

我需要一些方法來跟蹤布爾標誌的四維數組。只是真/假值。看起來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

回答

3

如果數組是稀疏的(罕見的真值);你可以使用collections.defaultdict

from collections import defaultdict 

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

您可以使用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

0

如何像

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]轉置輸出的形狀。當然,這只是讓你成爲「空」的陣列。

1

如果你想要的是存儲並從4維對象獲取,或者用一個字典:

In [7]: x = {} 

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

# get 
In [9]: x[1,2,3,4] 
Out[9]: True 
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}) 
相關問題