【发布时间】:2016-06-28 11:56:43
【问题描述】:
通常,numpy 数组比列表操作或循环快得多,但在这种情况下也是如此?:
前三个轴有一个 4D 数组和一个布尔索引数组;索引的输出被展平,至少在索引轴上',所以它是一个'元组列表'(但以数组形式)。
由于常规结构被破坏,我认为这比常规网格的索引(即独立索引每个轴)要慢得多?也许 numpy 内部真的计算了一个元组列表,然后将其转换为一个数组?
我问的原因:我想枚举输出,以便能够计算任何元组是否在列表中,以及在哪个位置。我试图了解哪种方法可能既快速又优雅...
我的背景: 我有一个整数坐标数组,一个网格 - 所以逻辑上我有一个 3 元组的 3D 数组,但对于程序来说它是一个 4D 数组。
我想得到坐标总和等于常数的所有点,这就是从我的立方体中切出一个平面(最后,我取两个相邻的平面,这给了我一个蜂窝格子 - 如果你像数学:))
所以最后一个轴的值只是前三个轴的索引。如果我不仅有一个True 和False 的索引数组,而且还分配了一个id 而不是每个True,那么我可以很容易地读出每个元组的id。
这可能是完成任务的一种优雅而快速的方法(目标是了解其中一个平面中的每个站点的另一个站点是相邻的——因此它们的坐标是已知的,但我想要它们的 ID)。
那么,numpy 内部是否有任何魔法来获取索引数组?或者使用for-loop 会不会同样快;)(不,我通过尝试看到,这要快得多,但是为什么...)
一些代码(德语中的 cmets,对不起)
import numpy as np
Seitenlaenge = 4
kArray = np.zeros((Seitenlaenge, Seitenlaenge, Seitenlaenge, 3)) # 4D-Array, hier soll dann an der Stelle [x, y, z, :] der Vektor (x, y, z) stehen
kArray[:, :, :, 2] = np.arange(Seitenlaenge).reshape((1, 1, Seitenlaenge)).repeat(Seitenlaenge, axis = 0).repeat(Seitenlaenge, axis = 1)
kArray[:, :, :, 1] = np.arange(Seitenlaenge).reshape((1, Seitenlaenge, 1)).repeat(Seitenlaenge, axis = 0).repeat(Seitenlaenge, axis = 2)
kArray[:, :, :, 0] = np.arange(Seitenlaenge).reshape((Seitenlaenge, 1, 1)).repeat(Seitenlaenge, axis = 1).repeat(Seitenlaenge, axis = 2)
# Die Gitterpunkte waehlen die zu A und B gehoeren:
print kArray
Summe = 5 # Seitenlaenge des Dreiecks, das aus dem 1.Oktanten geschnitten wuerde, wenn der Wuerfel nicht kleiner waere
ObA = kArray.sum(axis=-1) == Summe-1 # 3D-boolean Array
ObB = kArray.sum(axis=-1) == Summe-2
print ObA
kA, kB = kArray[ObA], kArray[ObB] # Es bleiben 2D-Arrays: Listen von Koordina-
# tentripeln, in der Form (x, y, z)
print kA
如果你喜欢看蜂窝格子,然后再做:
import matplotlib.pyplot as plt
nx = np.array([-1, 1, 0])*2**-0.5
ny = np.array([-1, -1, 2])*6**-0.5
def Projektion(ListeTripel):
return dot(ListeTripel, nx), dot(ListeTripel, ny)
xA, yA = Projektion(kA)
xB, yB = Projektion(kB)
plt.plot(xA.flatten(), yA.flatten(), 'o', c='r', ms=8, mew=0)
plt.plot(xB.flatten(), yB.flatten(), 'o', c='b', ms=8, mew=0)
plt.show()
【问题讨论】:
-
发布一些示例数据?
标签: python arrays numpy boolean