2

考虑一个由不同密度的壳组成的球体。
我有两个数组,一个用于每个壳的外半径 ( rad[]),一个用于每个壳的密度 ( den[])。我想计算质量,直到给定的半径,称为mass[]

以下 for 循环方法通过首先找到最内层壳的质量(内半径为零,因此它是一个球体),然后将每个后续壳的质量 - 添加到前一个(总和)质量来实现所需的结果:

mass = numpy.zeros(len(rad))                                   # create array
mass[0] = den[0]**(rad[0]**3)                                  # find inner sphere mass
for i in range(1,len(mass)):
    mass[i] = mass[i-1] + den[i]*(rad[i]**3 - rad[i-1]**3)     # Find mass out to shell i

注意:我只需要缩放,所以我不担心 pi 的因素。

谁能解释为什么下面的切片结果没有达到相同的结果?

mass = numpy.zeros(len(rad))
mass[0]  = den[0]*(rad[0]**3)
mass[1:] = mass[0:-1] + den[1:]*(rad[1:]**3-rad[0:-1]**3)
4

1 回答 1

3

原因是 numpy 数组中的所有元素将同时计算。第二行中的数组mass[0:-1]将被评估为den[0]*(rad[0]**3)后跟零。(计算线mass[1]后将不再为零的事实无关紧要 - 到那时为时已晚)。

你注意到这个例子:

test = numpy.linspace(1,10,num=10)
test[1:] += test[0:-1]
# [  1.   3.   6.  10.  15.  21.  28.  36.  45.  55.]

工作方式不同,就好像添加确实是迭代发生的。您的示例中的不同之处在于在右侧添加了一个值 - 该添加使其成为内存中的新数组(x + y与 不同的数组x),因此numpy不再将其视为添加到自身。看这个例子

test = numpy.linspace(1,10,num=10)
test[1:] += test[0:-1] + 0
# [  1.   3.   5.   7.   9.  11.  13.  15.  17.  19.]

如果你想做一个矢量化版本的 for 循环,你可以这样做:

mass[1:] += den[1:]*(rad[1:]**3-rad[0:-1]**3)
mass[1:] += mass[0:-1]
于 2013-03-10T00:28:27.483 回答