将数组转换为python标量
我需要很大的帮助,请查看以下代码:将数组转换为python标量,python,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 t
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
如果你想对数组执行数学运算(无论它们的维数……),你都应该考虑使用它。在您的情况下,相应的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。如果需要,数组的每个元素都要乘以-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来实现这一点。 下面是使用嵌套循环的方法:
>>> 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是一种过度杀戮,那么使用列表理解可以更快地完成上面的工作 我的预期输出与aI的形状相同,我这样做主要是为了可读性。OP似乎是一个(python)初学者。此外,虽然就地更改很容易,但会丢失原始数组,这在处理编码时通常是不可取的。我还发布了如何保留列表的副本。在迭代列表时使用append是一种糟糕的风格。另外,它遍布整个网络,在一次编程之后,你会问自己:等等,我如何迭代和更改值。这就是我们的枚举率。这就是OP所问的,如何改变价值观。那么让我们同意不同意吧。我的目标是可读性第一,保留原始列表第二。使用枚举不适合这种情况。OP显然是初学者,当你理解语言时,风格很重要。