2

我需要很大的帮助,请查看以下代码:

import.math

dose =20.0
a = [[[2,3,4],[5,8,9],[12,56,32]]
     [[25,36,45][21,65,987][21,58,89]]
     [[78,21,98],[54,36,78],[23,12,36]]]
PAC = math.exp(-dose*a)

这是我想做的。但是我得到的错误是

TypeError: only length-1 arrays can be converted to Python scalars
4

3 回答 3

13

如果您想对数组执行数学运算(无论它们的尺寸如何......),您应该真正考虑使用专为此设计的NumPy 。在您的情况下,相应的 NumPy 命令将是:

PAC = numpy.exp(-dose*np.array(a))

如果 NumPy 不是一个选项,你将不得不循环每个元素a,计算你的math.exp,将结果存储在一个列表中......真的很麻烦而且效率低下。这是因为math当您传递一个(列表)列表时,这些函数需要一个标量作为输入(正如异常告诉您的那样)。但是,您可以将所有循环组合在一个列表推导中:

PAC = [[[math.exp(-dose*j) for j in elem] for elem in row] for row in a]

但再一次,我强烈推荐 NumPy。

于 2012-09-06T08:38:42.260 回答
2

你真的应该为此使用 NumPy。以下是使用嵌套循环的方法:

>>> for item in a:
...     for sub in item:
...         for idx, number in enumerate(sub): 
...             print number, math.exp(-dose*number)
...             sub[idx] = math.exp(-dose*number)

使用append很慢,因为每次你复制前一个数组并将新项目堆叠到它。使用枚举,就地更改数字。如果您想保留 a 的副本,请执行以下操作:

 acopy = a[:]

如果你没有太多的数字,并且 NumPy 是一个过度杀戮,那么使用列表推导可以更快地完成上述操作。

于 2012-09-06T08:50:20.040 回答
0

如果您愿意,将数组的每个元素乘以 -dose 然后将 math.exp 应用于结果,您需要一个循环:

new_a = []
for subarray in a:
    new_sub_array = []
    for element in sub_array:
        new_element = math.exp(-dose*element)
        new_sub_array.append(new_element)
    new_a.append(new_sub_array)

或者,如果您有数学实验室背景,您可以查询numpy,它可以对数组进行转换。

于 2012-09-06T08:44:48.980 回答