【发布时间】:2015-11-27 20:53:31
【问题描述】:
我有“Ball”,有一些属性,如“x”、“y”和“z”,它们会循环多个“Steps”。
我在属性交互的地方做了很多数学运算,因此,为了使我的代码更易于阅读和编写,我将数组元素的位置命名为它们的物理位置:
x = 0
y = 1
z = 2
有了这个,我可以这样写:
for Step in xrange(steps):
for Ball in xrange(balls)
ball[Ball,**z**,Step] + ball[Ball,**velocity_z**,Step]*dt
与记住每个属性的位置相反:
for Step in xrange(steps):
for Ball in xrange(balls)
ball[Ball,**2**,Step] + ball[Ball,**2**,Step]*dt
这是我当前的属性列表:
x = 0
y = 1
z = 2
vel_x = 3
vel_y = 4
vel_z = 5
acc_x = 6
acc_y = 7
acc_z = 8
mass = 9
radius = 10
w_x = 11
w_y = 12
w_z = 13
mag_w = 14
mag_vel = 15
mag_acc = 16
velh_x = 17
velh_y = 18
velh_z = 19
这将确定我的数组的第二维大小为 20。我喜欢这如何使代码易于阅读和编写,并且我当然不想使用字典或任何效率极低的东西,因为我的程序需要像 python 一样快地运行,但我想知道是否有人有一个更优雅的解决方案,计算速度一样快。
谢谢。
【问题讨论】:
-
使用常量已经足够优雅了。请尊重您的代码中的PEP-8
-
代码中缓慢的部分将是循环所有球和所有步骤。如果您需要速度,请考虑使用 numpy 数组或 pandas DataFrames。 DataFrames 还允许您使用带标签的数组,这似乎是您在这里想要完成的。但我相信,您采用的方法在很大程度上可能会被命名元组所取代。
-
也许可以查看 dask (dask.pydata.org/en/latest)。它支持标记层并努力提高效率。它是由 astro-nerds 构建的,所以我确信它考虑到了计算。
-
我会看看dask。谢谢。 @Pynchia 我不尊重什么?
-
@jme 我正在使用 numpy 数组。 ball[Ball,x,Step] 是一个 numpy 3D 数组。
标签: python arrays multidimensional-array naming-conventions readability