我讀到Python實際上並不支持二維數組,而是一個數組的數組。我理解數組的事物,但支持2D數組意味着什麼?二維數組支持是什麼意思?
在C中,2D數組通過做一些花哨的數學(Seen here)簡單地轉換爲1D數組。是否有語言實現實際的二維數組?
感謝您的幫助,我希望我沒有寫出重複的問題;如果是這樣給我一個鏈接,並關閉我的問題:)
我讀到Python實際上並不支持二維數組,而是一個數組的數組。我理解數組的事物,但支持2D數組意味着什麼?二維數組支持是什麼意思?
在C中,2D數組通過做一些花哨的數學(Seen here)簡單地轉換爲1D數組。是否有語言實現實際的二維數組?
感謝您的幫助,我希望我沒有寫出重複的問題;如果是這樣給我一個鏈接,並關閉我的問題:)
有語言,實現2D(或3D等)數組。 Fortran就是其中之一。這意味着你可以編寫一個數組索引表達式,如array[x,y]
,這個語言將負責數學運算以找到正確的元素。
此外,Numpy是Python的數值擴展,提供了n維數組。
Fortran具有真正的多維數組。 This link在FORTRAN 77案例中討論了它們。
我想'支持二維數組'意味着該語言如何讓您像訪問二維數組一樣訪問數據。在C花哨的數學是由數組構造隱藏:
char arr[5][5];
char c = arr[2][3];
有一種方法通過指針算術要做到這一點,以及(你可能是指花式數學)。
實際上,內存是一大塊可尋址的數據字節[0,1,2,3,4,5,6 ...內存結束],所以沒有2D數組的原生概念,某處必須將程序員「行1列2」翻譯成內存中的實際地址。編程語言通常會給你一種隱藏翻譯的方法。
有人已經提到過numpy
,並且OP評論說「它回到了C數組的奇特指針數學」 - 這是一個完全不重要的實現細節!由於在(正常;-)計算機底層存儲器可被視爲字節(或字)的陣列,以及然後當然任何數據結構任何在該陣列的基礎上實現(或其片段)的加「看中的指針數學」 - 雙端隊列,多維數組,二叉樹,你的名字,底層的實現總是會歸結到(就像所有花哨的控制結構在機械設備級歸結爲有條件和無條件跳轉等等)。 SO什麼?!當然,這些是執行的細節。 numpy
,就像Fortran和其他語言和庫,提供N維數組 - 不管它是如何實現他們「內心深處」(實際上numpy的是相當前面有關,你可以很容易地展平,重塑陣列 - 這是很典型的Python提供更高層次的抽象,並且與較低層次的抽象相關聯具有相當不錯的「鉤子」;-)。
E.g.,
>>> import numpy
>>> x = numpy.arange(12)
>>> x
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
>>> x.reshape((3,4))
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> x.reshape((4,3))
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
>>> x.reshape((4,3))[::2, ::2]
array([[0, 2],
[6, 8]])
>>> x.reshape((4,3))[(0,1,3), ::2]
array([[ 0, 2],
[ 3, 5],
[ 9, 11]])
>>>
可以重塑,索引片和模具具有很高的靈活性和性能優良的N維陣列中的數據 - 即使知道底層數據塊僅僅是一維陣列(在此x出生並保持1-D,但即使不是這種情況,您仍然可以使用通過展平來訪問底層1維數組)。
這是「爲N維陣列支持」是指(雖然在大多數其他語言和框架提供這樣的支持,你可能會得到更少的透明度,更低的功能,或兩者;-)。
+1 python像往常一樣酷...... – stefanB 2009-11-09 03:11:45
實際數組在Python中 - 也就是array
模塊創建的array
對象 - 嚴格來說是一維的。除非你的代碼必須與C數據結構互操作,你正在處理大量必須保存在內存中的數據,或者你正在編寫類似numpy
的東西,否則它們也可能不會被使用。
Rosetta Code的Python示例爲creating a two dimensional array。
Numpy使用C擴展,所以它回到了C數組的奇特指針數學。 – Nope 2009-11-09 01:05:14
numpy的作者使用花式指針數學。你作爲它的用戶不必。 – 2009-11-09 01:19:08