一个例子:
>>> 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
将是一个合适的结果。我错过了什么?
答案 0 :(得分:5)
你的数组有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
BTW,list
和array
不是python中变量的好名字。
答案 1 :(得分:2)
你告诉我们:
>>> np.shape(array)
(4,)
也就是说,它是一个元素元组。
m, n = (4,)
产生相同的错误。元组中有一个元素,因此Python只能将其解压缩为1个变量。这不是numpy
问题。在进行这种解包时,变量的数量必须与元组(或列表)中的术语数相匹配。
如果您来自MATLAB,您可能希望所有阵列都是2d或更大。但是在numpy中,数组可以是1d甚至0d(形状为()
)。确保您的数组包含2个维度有多种方法:reshape
,额外[]
,[None,...]
,np.atleast_2d
。
答案 2 :(得分:1)
这是因为numpy将此数组处理为1D array
而np.shape
返回此1D array
的形状值,这是一个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
作为变量名。