将数组转换为python

2024-09-28 23:30:33 发布

您现在位置: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

Tags: to代码importonly错误mathbecan
3条回答

如果你想对数组(不管它们的维数是多少……)执行数学运算,你真的应该考虑使用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。 下面是使用嵌套循环的方法:

>>> 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很慢,因为每次复制前一个数组并将新项堆栈到其中时。 使用enumerate,在适当的位置更改数字。如果要保留的副本,请执行以下操作:

 acopy = a[:]

如果你没有太多的数字,而且NumPy是一个过度杀戮,那么使用列表理解可以更快地完成上面的工作。

如果需要,要使数组的每个元素乘以-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,它支持数组上的转换。

相关问题 更多 >