我有一個3d numpy數組,A,不同元素的分解不相等,即形狀(A [0])=(1,2),形狀(A [1])=(3 ,4)等。我想以最有效的方式設置A的所有元素的值以使其爲零。我怎樣才能做到這一點?如何設置零3d numpy數組?
謝謝!
我有一個3d numpy數組,A,不同元素的分解不相等,即形狀(A [0])=(1,2),形狀(A [1])=(3 ,4)等。我想以最有效的方式設置A的所有元素的值以使其爲零。我怎樣才能做到這一點?如何設置零3d numpy數組?
謝謝!
你有什麼是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)
非常感謝((: – user1767774
編輯:對不起,我沒有意識到你從不同大小的列表中創建了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
的(檢查A
的dtype
。它應該是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)
非常感謝。 – user1767774
我是li這裏很困惑......通常,一個numpy數組有一個單一的形狀,而不是多個形狀。你有2d numpy數組的列表或元組嗎? – mgilson
我以這種方式定義它:A = np.array([[[1,2],[3,4]],[[1,2,3],[4,5,6],[7,8, 9]]]) – user1767774
所以你有一個對象數組 - 它不同於一個3d數組。 (注意'dtype = object')。出於好奇,你對這組對象做什麼?通常,從這種數據結構中獲得的優勢並不多。 – mgilson