2012-09-06 43 views
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) 

这一点,我想怎么办。但是如果你想在阵列(无论其尺寸...)进行数学运算,你真的应该考虑使用NumPy这是刚刚为设计的,我得到的错误是

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

您的预期产量是多少? –

+0

我的预期是与 – CharlieShe

回答

13

。在你的情况,相应的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的。

+0

Perfect形状相同:) :) – CharlieShe

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) 

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

+0

你知道枚举吗?它比追加到new_a []更快... – Oz123

+0

我这样做主要是为了可读性。 OP看起来相当不错(python)初学者。此外,在适当的位置变换很容易,你会丢失原始数组,这在处理编码时通常是不理想的。 – LBarret

+0

我也发布了如何保留列表的副本。迭代列表时使用append是一种不好的样式恕我直言。另外,它遍布整个网络,然后在编程之后,你问自己:等待如何迭代和更改值。因为我们已经发现了。 OP就是这样问的,如何改变这些值。 – Oz123

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是缓慢的,因为每次你复制前一阵和堆栈新项目给它。 使用枚举,就地更改数字。如果你想保留的副本,这样做:

acopy = a[:] 

如果你没有太多的数字,NumPy的是一个超必杀,上面可以一点点更快完成应用列表解析。