示例:
>>> import numpy as np
>>> list = [1,2,3,4]
>>> array = np.asarray(list)
>>> np.shape(array)
(4,)
现在假设我想处理一个普通数组,并分别将行数和列数读取到变量m
和n
中,我会这样做:
>>> m, n = np.shape(array)
但是这会导致错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack
为上面的例子。在我上面的例子中,我本以为m=1
和n = 4
是合适的结果。我错过了什么?
你的数组有ndim=1,这意味着len(array.shape)==1
。因此,不能将shape
元组解包为长度==2的元组。
要"拉伸"你的数组为2dim,如果它目前有更少,使用np.atleast_2d
。
>>> x = np.arange(3.0)
>>> y = np.atleast_2d(x)
>>> y
array([[ 0., 1., 2.]])
>>> m, n = y.shape
顺便说一句,list
和array
在python中不适合作为变量名。
你向我们展示了:
>>> np.shape(array)
(4,)
也就是说,它是一个单元素元组。
m, n = (4,)
产生相同的错误。元组中只有一个元素,所以Python只能将其解包为一个变量。这不是numpy
的问题。在进行这种解包时,变量的数量必须与元组(或列表)中的项的数量相匹配。
如果您来自MATLAB,您可能期望所有数组都是2d或更大。但是在numpy中,数组可以是1d甚至是0d(形状为()
)。有多种方法可以确保你的数组有2个维度- reshape
,额外的[]
, [None,...]
, np.atleast_2d
.
这是因为numpy将此数组处理为1D array
,而np.shape
返回此1D array
的shape值,这是一个具有单个元素的tuple
。
因此,我们可以通过添加[]将其更改为2D array
,如[[1,2,3,4]]
。
你可以这样做:
import numpy as np
list = [[1,2,3,4]]
array = np.asarray(list)
print np.shape(array)
m, n = np.shape(array)
print m,n
输出:(1, 4)
1 4
或者你也可以这样做:
import numpy as np
list = [1,2,3,4]
list = [list]
array = np.asarray(list)
print np.shape(array)
m, n = np.shape(array)
print m,n
输出:(1, 4)
1 4
我希望这对你有帮助。
是的,你应该避免在Python中使用list
和array
作为变量名。