将数组转换为python标量

时间:2012-09-06 08:31:15

标签: python

我需要大帮助,请查看此代码:

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

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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是一个过度杀戮,使用列表推导可以更快地完成上述操作。

答案 2 :(得分: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)

另外,如果你有一个mathlab背景,你可以查询numpy,在阵列上启用转换。