python - Numpy 数组切片与 for 循环结果

标签 python arrays numpy slice

考虑一个由不同密度的贝壳组成的球体。
我有两个数组,一个用于每个壳的外半径 (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 + yx 不是同一数组),这样 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/

相关文章:

python - 如何在python中使用回调函数?

Python Google Sheets API 循环限制 429 错误

python - 切诺基导致产生多个 uwsgi 实例的问题

python - 当主线程调用 sys.exit() 时,其他线程会发生什么?

python - 二维数组的numpy 3d张量

javascript - 在 javascript 中使用方括号表示法读取 json

java - 从另一个类调用一个类而无需更改类类型(或返回)Java

arrays - 传递 slice 而不是指针

python - 使用 Cython 时缺少 numpy 属性

python - 使用 numpy loadtxt 将 CSV 文件导入 Google Colab