Python,将2d列表中的所有数字除以10,然后返回2d列表

Python,将2d列表中的所有数字除以10,然后返回2d列表,python,Python,我写了这个解决方案,来自Ruby,看起来非常优雅。然而,python程序员会这样做吗 a = [[2,3,4], [9,1,2]] print map(lambda(i): map(lambda(p): p/10.0,i), a) 而且。。。如果我想使用嵌套2d列表中所有值的总和而不是10,该怎么办?这通常通过使用理解来解决,在本例中是嵌套列表理解: >>> from __future__ import division # for python-2.x compatib

我写了这个解决方案,来自Ruby,看起来非常优雅。然而,python程序员会这样做吗

a = [[2,3,4], [9,1,2]]
print map(lambda(i): map(lambda(p): p/10.0,i), a)

而且。。。如果我想使用嵌套2d列表中所有值的总和而不是10,该怎么办?

这通常通过使用理解来解决,在本例中是嵌套列表理解:

>>> from __future__ import division   # for python-2.x compatibility
>>> [[item / 10 for item in subl] for subl in a]
[[0.2, 0.3, 0.4], [0.9, 0.1, 0.2]]
这可能比
map
更快,并且避免了所有
lambda
函数

如果我想使用嵌套2d列表中所有值的总和而不是10,会怎么样

使用
sum
和嵌套的生成器表达式计算总数:

>>> sum_ = sum(item for subl in a for item in subl)
>>> [[item / sum_ for item in subl] for subl in a]
[[0.09523809523809523, 0.14285714285714285, 0.19047619047619047],
 [0.42857142857142855, 0.047619047619047616, 0.09523809523809523]]

但是使用NumPy阵列就更容易了。NumPy是一个第三方软件包,但功能强大且速度快:

>>> import numpy as np
>>> arr = np.array(a)
>>> arr / 10.   # element-wise division
array([[ 0.2,  0.3,  0.4],
       [ 0.9,  0.1,  0.2]])

>>> arr / arr.sum()  # sum over all elements then element-wise division
array([[ 0.0952381 ,  0.14285714,  0.19047619],
       [ 0.42857143,  0.04761905,  0.0952381 ]])

列表理解要优雅得多,而且会被认为更像Python(具有更好的可读性):


另外,请注意,
map
在Python3中不会返回列表,它返回一个迭代器对象。您需要对每个地图对象调用
list
,以将它们计算到列表中。list comp在不同版本之间返回相同的结果。

另一种方法是使用,因为它处理数组,并且默认情况下,其运算符处理数组的每个元素

In [1]: import numpy as np

In [2]: a = np.array([[2,3,4], [9,1,2]])

In [3]: a/10
Out[3]: 
array([[ 0.2,  0.3,  0.4],
       [ 0.9,  0.1,  0.2]])
要除以所有数字之和,请执行以下操作:

In [6]: a/a.sum()
Out[6]: 
array([[ 0.0952381 ,  0.14285714,  0.19047619],
       [ 0.42857143,  0.04761905,  0.0952381 ]])

我听说过很多关于numpy的事。如果这就是我所需要的一切,这会被认为是杀伤力过大吗?另外,我希望结果是一个列表。至少我认为我是…@pitosalas一旦你开始使用它,你会发现它对很多事情都很有用。它能够使许多数字代码非常紧凑和快速。例如,它也可以做离散傅里叶变换之类的事情。这使得处理多维列表非常容易。请注意我对上述问题的更新。如果我不想除以10,而是想除以所有整数的和呢?low normalize it?@pitosalas
numpy
用于处理固定大小的真正多维数值数组,与普通Python
list
数据结构相比,numpy数组具有不同的性能优势,在CPython中,它被实现为一个经过微调的动态数组,可以容纳异构数据类型,具有摊销的常量时间
.append
.pop
操作。另外,如果您的2d列表可以“交错”,numpy不支持这一点(非常优雅),那么香草python
list
就是最好的选择。如果你在大数组上做线性代数,那么使用
numpy
In [6]: a/a.sum()
Out[6]: 
array([[ 0.0952381 ,  0.14285714,  0.19047619],
       [ 0.42857143,  0.04761905,  0.0952381 ]])