Python NumPy'de boyut ve eksen nedir?


82

Pythons NumPymodülü ile kod yazıyorum . 3B uzayda bir noktanın koordinatları şu şekilde tanımlanıyorsa [1, 2, 1], bu üç boyut, üç eksen, üçün rütbesi olmaz mıydı? Ya da bu tek boyutsa, nokta değil, nokta (çoğul) olması gerekmez mi?

İşte belgeler:

Numpy'de boyutlara eksen denir. Eksen sayısı rütbedir. Örneğin, 3B uzaydaki [1, 2, 1] bir noktanın koordinatları bir sıra 1 dizisidir, çünkü bir ekseni vardır. Bu eksenin uzunluğu 3'tür.

Kaynak: http://wiki.scipy.org/Tentative_NumPy_Tutorial

Yanıtlar:


97

Numpy arrays'de axesboyutluluk, herhangi bir geometrik uzayın boyutluluğunu değil, onu indekslemek için gereken sayıya işaret eder . Örneğin, 3B alanda noktaların konumlarını 2B bir dizi ile tanımlayabilirsiniz:

array([[0, 0, 0],
       [1, 2, 3],
       [2, 2, 2],
       [9, 9, 9]])

Hangi sahip shapebir (4, 3)ve boyut 2. Ancak, 3B alanı tanımlayabilir çünkü her satırın ( axis1) uzunluğu üçtür, dolayısıyla her satır, bir noktanın konumunun x, y ve z bileşeni olabilir. axis0'ın uzunluğu nokta sayısını gösterir (burada, 4). Bununla birlikte, bu, dizinin kendisinin bir niteliği değil, kodun tanımladığı matematiğe daha çok bir uygulamadır. Matematikte, bir vektörün boyutu onun uzunluğu olacaktır (örneğin, bir 3B vektörün x, y ve z bileşenleri), ancak numpy'de, herhangi bir "vektör" gerçekten sadece değişen uzunlukta bir 1d dizisi olarak kabul edilir. Dizi, açıklanmakta olan alanın (varsa) boyutunun ne olduğu umurunda değil.

Bununla oynayabilir ve bir dizinin boyutlarının sayısını ve şeklini şöyle görebilirsiniz:

In [262]: a = np.arange(9)

In [263]: a
Out[263]: array([0, 1, 2, 3, 4, 5, 6, 7, 8])

In [264]: a.ndim    # number of dimensions
Out[264]: 1

In [265]: a.shape
Out[265]: (9,)

In [266]: b = np.array([[0,0,0],[1,2,3],[2,2,2],[9,9,9]])

In [267]: b
Out[267]: 
array([[0, 0, 0],
       [1, 2, 3],
       [2, 2, 2],
       [9, 9, 9]])

In [268]: b.ndim
Out[268]: 2

In [269]: b.shape
Out[269]: (4, 3)

Dizilerin birçok boyutu olabilir, ancak iki veya üçün üzerinde görselleştirmek zorlaşır:

In [276]: c = np.random.rand(2,2,3,4)

In [277]: c
Out[277]: 
array([[[[ 0.33018579,  0.98074944,  0.25744133,  0.62154557],
         [ 0.70959511,  0.01784769,  0.01955593,  0.30062579],
         [ 0.83634557,  0.94636324,  0.88823617,  0.8997527 ]],

        [[ 0.4020885 ,  0.94229555,  0.309992  ,  0.7237458 ],
         [ 0.45036185,  0.51943908,  0.23432001,  0.05226692],
         [ 0.03170345,  0.91317231,  0.11720796,  0.31895275]]],


       [[[ 0.47801989,  0.02922993,  0.12118226,  0.94488471],
         [ 0.65439109,  0.77199972,  0.67024853,  0.27761443],
         [ 0.31602327,  0.42678546,  0.98878701,  0.46164756]],

        [[ 0.31585844,  0.80167337,  0.17401188,  0.61161196],
         [ 0.74908902,  0.45300247,  0.68023488,  0.79672751],
         [ 0.23597218,  0.78416727,  0.56036792,  0.55973686]]]])

In [278]: c.ndim
Out[278]: 4

In [279]: c.shape
Out[279]: (2, 2, 3, 4)


9

Dizine eklemek için bir dizine ihtiyacınız olduğu için birinci sıradadır. Tek eksenli uzunluğu 3 olduğunu, endeks indeksleme gibi üç farklı değerler alabilir: v[i], i=0..2.


8

Bu yanıttan yanıtın bir kısmını yapıştırmanız yeterlidir :

Numpy'de boyut , eksen / eksenler , şekil birbiriyle ilişkilidir ve bazen benzer kavramlardır:

In [1]: import numpy as np

In [2]: a = np.array([[1,2],[3,4]])

boyut

Gelen Matematik / Fizik , boyut veya boyutluluk gayri bir alan içinde herhangi bir noktayı belirlemek için yeterli koordinat minimum sayısı olarak tanımlanır. Ama içinde Numpy göre numpy doc , bu eksen / eksen aynıdır:

Numpy'de boyutlara eksen denir. Eksen sayısı rütbedir.

In [3]: a.ndim  # num of dimensions/axes, *Mathematics definition of dimension*
Out[3]: 2

eksen / eksenler

Numpy'de bir indekslemek için n'inci koordinat array. Ve çok boyutlu dizilerin eksen başına bir indeksi olabilir.

In [4]: a[1,0]  # to index `a`, we specific 1 at the first axis and 0 at the second axis.
Out[4]: 3  # which results in 3 (locate at the row 1 and column 0, 0-based index)

şekil

mevcut her eksende kaç veri olduğunu açıklar.

In [5]: a.shape
Out[5]: (2, 2)  # both the first and second axis have 2 (columns/rows/pages/blocks/...) data

5

Eksen parametresini grup işlemlerinde de kullanabilirsiniz , eksen = 0 olması durumunda Numpy, eylemi her sütunun öğeleri üzerinde gerçekleştirir ve eksen = 1 ise, satırlar üzerinde eylemi gerçekleştirir.

test = np.arange(0,9).reshape(3,3)

Out[3]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

test.sum(axis=0)
Out[5]: array([ 9, 12, 15])

test.sum(axis=1)
Out[6]: array([ 3, 12, 21])

4

Ben böyle anlıyorum. Nokta, 1 boyutlu bir nesnedir. Yalnızca konumunu tanımlayabilirsiniz. Boyutları yoktur. Çizgi veya yüzey, 2B nesnedir. Sırasıyla hem konumu hem de uzunluğu veya alanı ile tanımlayabilirsiniz, örneğin Dikdörtgen, Kare, Daire Bir hacim bir 3B nesnedir. Bunu konumu, yüzey alanı / uzunlukları ve hacmi ile tanımlayabilirsiniz, örneğin Sphere, Cube.

Bundan, kullandığınız matematiksel eksenlerin sayısına bakılmaksızın, NumPy'de tek bir eksen (boyut) ile bir nokta tanımlayacaksınız. X ve y eksenleri için bir nokta [2,4] olarak tanımlanır ve x, y ve z eksenleri için bir nokta [2,4,6] olarak tanımlanır. Bunların her ikisi de noktadır, dolayısıyla 1D.

Bir çizgi tanımlamak için iki nokta gerekecektir. Bu, ikinci boyuta (2D) olan noktaların bir şekilde 'iç içe geçmesini' gerektirecektir. Bu nedenle, bir çizgi yalnızca [[2,4], [6,9]] olarak x ve y kullanılarak veya [[2,4,6], [6,9,12 gibi x, y ve z kullanılarak tanımlanabilir. ]]. Bir yüzey için, onu tanımlamak için daha fazla noktaya ihtiyaç duyacaktır, ancak yine de bir 2D nesne olarak kalır. Örneğin, bir üçgenin 3 noktaya, bir dikdörtgen / karenin 4 puana ihtiyacı olacaktır.

Bir hacim, onu tanımlamak için 4 (bir dört yüzlü) veya daha fazla noktaya ihtiyaç duyacaktır, ancak yine de noktaların üçüncü boyuta (3D) 'iç içe geçmesini' koruyacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.