map()函数增加python中的维度

时间:2015-03-13 02:24:51

标签: python numpy

我对地图功能有一个非常奇怪的问题,它会自动增加尺寸。

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)?我该如何解决这个问题?

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就足够了。如何避免迭代是一个经常出现的问题。