[英]how to set on zero 3d numpy array?
我有一個3d numpy數組A。不同元素的大小彼此不相等,即shape(A [0])=(1,2),shape(A [1])=(3,4 )等。我想以最有效的方式將A的所有元素的值設置為零。 我怎樣才能做到這一點?
謝謝!
您擁有的是一個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)
編輯 :對不起,我沒有意識到您是根據不同大小的列表創建的。 除非您使用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
文檔可以在這里閱讀。
另外,由於A是一個不保存數字的ndarray
,而是保存對其他ndarray
的引用 (請檢查A
的dtype
。它應該是object
),因此您不應該對A本身調用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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.