Python:如何判断多维数组是否为空,以及值错误
我正在这样初始化一个数组:
import numpy as np
g = np.array([no_classes, no_features, no_classes])
no_classes
和 no_features
都是整数,假设它们的值分别是 2 和 3。所以我打算创建一个形状为 (2,3,2) 的三维数组 g
。
之后,我计算了一个叫 temp_g
的二维数组,它的形状是 (no_features
, no_classes
)。
现在,在一个循环中,我想把 j 这个元素的 g
赋值为 temp_g
,前提是 g
还没有被赋值。如果 g
已经有值了,我就想用简单的矩阵加法把 temp_g
加到它上面。
if g[j] is []: # <-- is this the correct way to determine if g is empty?
g[j] = curr_g
else:
g[j] = g[j] + curr_g
但是我遇到了这个错误:
ValueError: setting an array element with a sequence.
我哪里做错了?
2 个回答
1
在Python中,is
用来检查对象的身份,也就是判断两个对象是否实际上是同一个。
>>>a=[]
>>>a is []
False
>>>
所以g[j] is []
这个表达式永远不会返回True
。正如这里所建议的,你可以检查一下size
这个属性。
2
- 不要用
is
来比较两个对象是否相等,应该用==
来比较:
In [110]: [] is [] Out[110]: False In [111]: []==[] Out[111]: True
- 你的
g
是一个一维的 numpy 数组,使用g[j]
可以获取其中的一个元素,而curr_g
可能是一个数组。要重现你的错误,可以这样做:
In [117]: l=np.arange(3) ...: l[0]=[1,2] #assigning an element of a numpy array to as a python list --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-117-817e72d77bd0> in <module>() 1 l=np.arange(3) ----> 2 l[0]=[1,2] ValueError: setting an array element with a sequence.
np.array([no_classes, no_features, no_classes])
会给你一个长度为 3 的一维数组。如果你想把g
初始化为一个形状为(no_classes, no_features, no_classes)
的三维数组,可以使用np.zeros
,比如:
In [124]: np.zeros((2,3,2)) Out[124]: array([[[ 0., 0.], [ 0., 0.], [ 0., 0.]], [[ 0., 0.], [ 0., 0.], [ 0., 0.]]])
- 要检查
g
的一个子数组是否未被赋值(也就是说,这里所有的值都是 0),可以使用np.allclose
:
In [128]: l=np.zeros((2,3,2)) In [129]: np.allclose(l[0], 0) Out[129]: True