代码之家  ›  专栏  ›  技术社区  ›  mooglinux

将计算结果写回其数组?

  •  0
  • mooglinux  · 技术社区  · 13 年前

    这是一个后续问题 my last one 关于编写高效的python程序。我一直在写我自己的物理模拟,想摆脱使用十亿个类和方法的困扰。

    所以我希望能够对数据集进行计算。这是我最近的一次尝试:

    particles = np.array([ #position, last position, velocity, mass, size
                     [[200,0],[200,200],[5,5],10,15], \
                     [[210,210],[210,210],[8,2],20,25],\
                     [[215,215],[195,195],[5,3],5,15], \
                     [[192,186],[160,160],[10,-4],30,30]])
    
    def moveParticles(part, dt):
        part[0] = part[1]
        part[1] += np.multiply(part[2],dt)
    

    我试图将每个粒子的每个属性存储在一个数组中,然后在适当的位置更新它们。在这里,我试图将速度向量乘以时间步长,然后将其与位置向量相加。这对我来说似乎是一种很自然的表达方式,但它给了我一个错误:

    TypeError: can't multiply sequence by non-int of type 'float'
    

    我可以将数据写回同一个数组吗?我将如何做到这一点?

    我一直在阅读,并研究了numpy的矢量化函数、itertools、map()等……但我该如何将结果放回原始数组?

    还是在覆盖原始数组之前使用中间数组来存储结果是唯一的方法?

    1 回复  |  直到 9 年前
        1
  •  2
  •   Bálint Aradi    13 年前

    我认为,您只是以错误的方式调用例程(可能会将其传递给整个粒子数组,而不是仅用于一个粒子的数组。

    无论如何,另一种可能的解决方案是将您的阵列拆分为单独的阵列:

    import numpy as np
    pos = np.array([[200,0], [210,210], [215,215], [192,186]], dtype=float)
    lastpos = np.array([[200,2000], [ 210,210], [195, 195], [160,160]], dtype=float)
    velocity = np.array([[ 5,5], [8,2], [5,3], [10,-4]], dtype=float)
    mass = np.array([ 10, 20, 5, 30 ], dtype=float)
    size = np.array([ 15, 25, 15, 30 ], dtype=float)
    
    def moveParticles(pos, lastpos, velocity, dt):
        lastpos[:] = pos[:]
        pos[:] += velocity * dt
    

    这将使 pos lastpos 。为了移动粒子,您必须调用以下函数:

    moveParticles(pos, lastpos, velocity, 1)
    

    其中我设置dt=1。我还假设,您希望有浮点坐标,如果没有,则应该生成整数数组。