我对地图功能有一个非常奇怪的问题,它会自动增加尺寸。
matrix = range(4)
matrix = numpy.reshape(matrix,(2,2))
vector = numpy.ones((1,2))
newMatrix = map(lambda line: line/vector, matrix)
np.shape(newMatrix) # I got (2,1,2)
我很困惑,矩阵的形状(2,2),但为什么在map()函数之后,newMatrix有这样的形状(2,1,2)?我该如何解决这个问题?
答案 0 :(得分:3)
我认为你要做的只是newMatrix = matrix / vector
。请记住,numpy
执行元素操作。 map
正在执行它定义的操作,即在将函数应用于迭代器中的每个项后返回一个列表。因此,map
一次对矩阵的每一行进行操作。你有两排;因此,你的新形状是2 x 1 x 2。
答案 1 :(得分:1)
此示例可能会说明正在发生的事情(我已将您的'矩阵'以及'矢量'名称替换为中性变量名称)
In [13]: x = np.arange(4).reshape(2,2)
In [14]: y=np.ones((1,2))
In [15]: list(map(lambda line:line/y, x))
Out[15]: [array([[ 0., 1.]]), array([[ 2., 3.]])]
请注意,2个数组的形状(1,2)
与y
的形状相匹配。 x[0,:]/y
也显示了这一点。在np.array...
中换行该列表,您会得到(2,1,2)
。
注意当我使用1d数组z
时会发生什么:
In [16]: z=np.ones((2,))
In [17]: list(map(lambda line:line/z, x))
Out[17]: [array([ 0., 1.]), array([ 2., 3.])]
我在Python3中运行了这个示例,其中map
返回一个生成器。要从中获取数组,我必须使用
np.array(list(map(...)))
我以为我之前没有看到map
使用numpy数组。我有点惊讶在Python2中它返回一个数组,而不仅仅是一个列表。迭代的一个更常见的版本是在np.array...
np.array([line/y for line in x])
但正如另一个答案所述,你不需要迭代这个简单的案例。 x/y
就足够了。如何避免迭代是一个经常出现的问题。