2014-01-08 70 views
2

我有一個3d numpy數組,A,不同元素的分解不相等,即形狀(A [0])=(1,2),形狀(A [1])=(3 ,4)等。我想以最有效的方式設置A的所有元素的值以使其爲零。我怎樣才能做到這一點?如何設置零3d numpy數組?

謝謝!

+3

我是li這裏很困惑......通常,一個numpy數組有一個單一的形狀,而不是多個形狀。你有2d numpy數組的列表或元組嗎? – mgilson

+0

我以這種方式定義它:A = np.array([[[1,2],[3,4]],[[1,2,3],[4,5,6],[7,8, 9]]]) – user1767774

+1

所以你有一個對象數組 - 它不同於一個3d數組。 (注意'dtype = object')。出於好奇,你對這組對象做什麼?通常,從這種數據結構中獲得的優勢並不多。 – mgilson

回答

2

你有什麼是np.array其持有的對象 - 在特定情況下,這些對象持有多個列表清單。對於我能想到的任何事情來說,這不是一個非常好的數據結構,除非你真的需要在內部列表中添加大量元素。我可否提出稍作更改,以便有一個np.array其中持有更多np.array

A = np.array(map(np.array, [ [[1,2],[3,4]], [[1,2,3],[4,5,6],[7,8,9]] ])) 

現在,如果我們打印出來,它看起來是這樣的:

>>> A 
array([[[1 2] 
[3 4]], [[1 2 3] 
[4 5 6] 
[7 8 9]]], dtype=object) 

和事物設置爲0,變得特別容易:

for sub_array in A: 
    sub_array[...] = 0 

而對於證明(再次打印A ):

>>> A 
array([[[0 0] 
[0 0]], [[0 0 0] 
[0 0 0] 
[0 0 0]]], dtype=object) 
+0

非常感謝((: – user1767774

1

編輯:對不起,我沒有意識到你從不同大小的列表中創建了A.我的代碼不應該工作,除非您使用np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])例如將A的每個元素轉換爲np.array

你可以試試陣列切片或使用NumPy的自己iter功能ndarray的,叫np.nditer

In [7]: %%time 
    ...: for arr in A: 
    ...:  arr[:] = 0 
    ...: 
CPU times: user 43 µs, sys: 13 µs, total: 56 µs 
Wall time: 52.9 µs 

In [8]: %%time 
    ...: for arr in A: 
    ...:  for x in np.nditer(arr, op_flags=('readwrite',)): 
    ...:   x[...] = 0 
    ...: 
CPU times: user 42 µs, sys: 5 µs, total: 47 µs 
Wall time: 47 µs 

文檔可以讀取here

此外,由於是ndarray是不成立的數字,而是擁有引用到其他ndarray的(檢查Adtype。它應該是object),你不應該在通話np.nditer本身,而是在A內的引用陣列上。否則,A的結構被破壞:

In [9]: %%time 
    ...: for arr in np.nditer(A, flags=('refs_ok',), op_flags=('readwrite',)): 
    ...:  for x in np.nditer(arr, flags=('refs_ok',), op_flags=('readwrite',)): 
    ...:   x[...] = 12 
    ...: 
CPU times: user 31 µs, sys: 2 µs, total: 33 µs 
Wall time: 34.1 µs 

In [10]: A 
Out[10]: array([12, 12], dtype=object) 
+0

非常感謝。 – user1767774