簡體   English   中英

Python - 多維數組

[英]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]

您可能希望將它包裝在一個類中以添加除簡單索引之外的功能,但是,不知道除了那之外你想要的什么(初始化/默認?切片?迭代?等等......),它也是很難猜到。 如果你可以准確地指定你想用“多維數組”做的所有事情,那么向你展示最能提供它的代碼應該不難!

我在這里寫了一個Matrix類:

Python中的多維數組

它可以像這樣使用:

m = Matrix(4,5,2,6)
m[2,3,1,3] = 'x'
m[2,3,1,3] // -> 'x'

另一種可能性是創建一維數組,然后使用帶有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM