如果我们将您的列表转换为数组,我们将得到一个包含对象的2D数组。
In [1941]: A = [[[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0], [0], [0]]]
In [1942]: A = np.array(A)
In [1943]: A.shape
Out[1943]: (2, 3)
In [1944]: A
Out[1944]:
array([[[0, 0, 0], [0, 0, 0], [0, 0, 0]],
[[0], [0], [0]]], dtype=object)
当我尝试执行
A+1
时,它会迭代
A
的元素,并尝试为每个元素执行
+1
。对于数字数组,它可以在快速编译的代码中完成。对于对象数组,它必须为每个元素调用
+
操作。
In [1945]: A+1
...
TypeError: can only concatenate list (not "int") to list
让我们再试一次,使用对
A
的平面迭代:
In [1946]: for a in A.flat:
...: print(a+1)
....
TypeError: can only concatenate list (not "int") to list
A
的元素是列表;对于列表,+
表示连接:
In [1947]: for a in A.flat:
...: print(a+[1])
...:
[0, 0, 0, 1]
[0, 0, 0, 1]
[0, 0, 0, 1]
[0, 1]
[0, 1]
[0, 1]
如果
A
的元素本身是数组,我认为
+1
会起作用。
In [1956]: for i, a in np.ndenumerate(A):
...: A[i]=np.array(a)
...:
In [1957]: A
Out[1957]:
array([[array([0, 0, 0]), array([0, 0, 0]), array([0, 0, 0])],
[array([0]), array([0]), array([0])]], dtype=object)
In [1958]: A+1
Out[1958]:
array([[array([1, 1, 1]), array([1, 1, 1]), array([1, 1, 1])],
[array([1]), array([1]), array([1])]], dtype=object)
为了回到纯列表形式,我们需要将对象数组的两个元素和数组本身都应用 tolist
:
In [1960]: A1=A+1
In [1961]: for i, a in np.ndenumerate(A1):
...: A1[i]=a.tolist()
In [1962]: A1
Out[1962]:
array([[[1, 1, 1], [1, 1, 1], [1, 1, 1]],
[[1], [1], [1]]], dtype=object)
In [1963]: A1.tolist()
Out[1963]: [[[1, 1, 1], [1, 1, 1], [1, 1, 1]], [[1], [1], [1]]]
这是一种相对繁琐的方法,用来给嵌套列表中的所有元素添加值。我可以通过一次迭代完成这个任务:
In [1964]: for i,a in np.ndenumerate(A):
...: A[i]=[x+1 for x in a]
...:
In [1965]: A
Out[1965]:
array([[[1, 1, 1], [1, 1, 1], [1, 1, 1]],
[[1], [1], [1]]], dtype=object)
在对象数组上执行数学运算有时成功,有时失败。一些操作确实会传播到元素,但这取决于元素的行为。
4
可能不值得麻烦。 - Divakar