考虑一个由不同密度的贝壳组成的球体。
我有两个数组,一个用于每个壳的外半径 (rad[]
),一个用于每个壳的密度 (den[]
)。我想计算给定半径的质量,称为质量[]。
以下 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)
最佳答案
原因是 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]
关于python - Numpy 数组切片与 for 循环结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15317470/