Python:如何判断多维数组是否为空,以及值错误

1 投票
2 回答
4936 浏览
提问于 2025-04-18 05:18

我正在这样初始化一个数组:

import numpy as np
g = np.array([no_classes, no_features, no_classes])

no_classesno_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

撰写回答