[英]Python - Multi-Dimensional Arrays
Python不提供對多維數組的內置支持。 我需要開發一個11維數組和一組函數來操作它(主要是線性代數,矢量算術)。 但是, 不允許外部庫導入 。 我有一個C代碼,並嘗試將其移植到Python:
typedef vec3_t float[3];
vec3_t Array[dim0][dim1][dim2][dim3][dim4][dim5][dim6][dim7][dim8][dim9][dim10];
Array[0][0][0][0][0][0][0][0][0][0][1] = {1.0, 0.0, 0.0};
如何有效地在Python中實現(具有良好的可讀性 )?
PS:最多為Python 2.5版本。
有這么多維度,並且不允許庫導入,我會(作為基本選擇)用於由元組索引的字典。 這樣,您可以獲得簡單索引的非常好的語法:
Array = dict()
Array[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1] = [1.0, 0.0, 0.0]
您可能希望將它包裝在一個類中以添加除簡單索引之外的功能,但是,不知道除了那之外你想要的是什么(初始化/默認?切片?迭代?等等......),它也是很難猜到。 如果你可以准確地指定你想用“多維數組”做的所有事情,那么向你展示最能提供它的代碼應該不難!
另一種可能性是創建一維數組,然后使用帶有11個索引參數的函數讀/寫它。 您將指數(基於每個維度的最大值)相乘以計算數組中的位置。 get / set函數本身並不是那么漂亮(有11個索引)但是一旦你編寫了它們,獲取和設置數組索引看起來就像在C中一樣干凈。我不確定性能如何比較對於嵌套列表,但我的猜測是有利的。
基本概念可以用2個維度顯示:
def readArray2(arr,i1,i2,dim2):
index = i1 * dim2 + i2
return arr[index]
但是,更多尺寸會變得更復雜:
def readArray3(arr,i1,i2,i3,dim2,dim3):
index = i1 * dim2 * dim3 + i2 * dim3 + i3
return arr[index]
對於更大的陣列等等。 您可以將其概括為可變數量的維度。 我可能會將索引和維度放入列表中,然后迭代它們。
一個可能非常清晰的解決方案雖然可能性能不佳,但會使用帶有十一元素元組的dict作為鍵:
>>> d[0,1,2,3,4,5,6,7,8,9,0] = [1.0, 0.0, 0.0]
這也允許您存儲坐標向量並將它們作為單個對象傳遞:
>>> coord = (0,1,2,3,4,5,6,7,8,9,0)
>>> d[coord]
[1.0, 0.0, 0.0]
您可以通過使用自己的類或dict的子類來強制執行密鑰完整性:
>>> class Space(dict):
>>> def __setitem__(self, key, value):
>>> if len(key) == 11:
>>> dict.__setitem__(self, key, value)
>>> else:
>>> raise IndexError("Keys must be eleven-dimensional vectors.")
您可以通過使用具有相同__getitem__
/ __setitem__
接口的自己的類來提高性能,但首先不需要這樣做。
"""
Create multi-dimensional array for given dimensions - (x1, x2, x3, ..., xn)
@author: Naimish Agarwal
"""
def multi_dimensional_array(value, *dim):
"""
Create multi-dimensional array
:param dim: a tuple of dimensions - (x1, x2, x3, ..., xn)
:param value: value with which multi-dimensional array is to be filled
:return: multi-dimensional array
"""
if len(dim) > 1:
return [multi_dimensional_array(value, *dim[1:]) for _ in xrange(dim[0])]
else:
return [value for _ in xrange(dim[0])]
if __name__ == "__main__":
multi_array = multi_dimensional_array(False, *(2, 3, 1))
print multi_array
首選numpy.ndarray
用於多維數組。
“多維度”只是一個意思是“許多記憶位置”的術語。 如果你從更廣泛的意義上看它,它們只是真正的“一維”。 無論如何,要建議替代方案,您可以使用詞典。
>>> d={}
>>> d[0]={}
>>> d[0][0]="1"
>>> d[0]
{0: '1'}
以這種方式創建你的dicts到你的“11”維度。
你可以使用列表:
list = [ [ [ '' for i in range(dim0) ] for j in range(dim1) ] for k in range(dim2) ]
等等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.