Python 如何设置零3d numpy阵列?
我有一个3d numpy数组,a。不同元素的维度彼此不相等,即形状(a[0])=(1,2),形状(a[1])=(3,4),等等。我想以最有效的方式将a的所有元素的值设置为零。我该怎么做Python 如何设置零3d numpy阵列?,python,numpy,Python,Numpy,我有一个3d numpy数组,a。不同元素的维度彼此不相等,即形状(a[0])=(1,2),形状(a[1])=(3,4),等等。我想以最有效的方式将a的所有元素的值设置为零。我该怎么做 谢谢 编辑:对不起,我不知道您是根据不同大小的列表创建的。除非使用np.array([[1,2,3],[4,5,6],[7,8,9]])将A的每个元素转换为np.array,否则我的代码不应该工作 您可以尝试阵列切片或使用NumPy自己的iter函数进行ndarray,称为np.nditer: In [7]: %
谢谢 编辑:对不起,我不知道您是根据不同大小的列表创建的。除非使用
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
。它应该是对象
),因此不应该在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)
您拥有的是一个np.array
,它包含对象——在您的特定情况下,这些对象是包含更多列表的列表。对于我能想到的任何东西来说,这都不是一个非常好的数据结构,除非您真的需要向内部列表添加大量元素。我是否可以建议对np.array
稍作修改,使其包含更多的np.array
s
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
):
我有点困惑。。。通常,numpy阵列只有一个形状,而不是多个形状。你有2d numpy数组的列表或元组吗?我这样定义它:a=np.array([[[1,2],[3,4],[[1,2,3],[4,5,6],[7,8,9]]),所以你有一个对象数组——这与3d数组不同。(请注意,dtype=object
)。出于好奇,你在用这些物体做什么?一般来说,这种数据结构没有太多优势。好吧,它应该包含人工神经网络的权重值……我对numpy很陌生,所以如果你有更好的选择,我很高兴听到。
>>> A
array([[[0 0]
[0 0]], [[0 0 0]
[0 0 0]
[0 0 0]]], dtype=object)