簡體   English   中英

如何在零3d numpy數組上設置?

[英]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引用 (請檢查Adtype 。它應該是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM