簡體   English   中英

[:][:] 和 [:,:] 之間的 NumPy 有什么區別?

[英]What is the difference in NumPy between [:][:] and [:,:]?

我對 python 編程非常熟悉,但是我發現了一些奇怪的情況,其中以下兩行代碼提供了不同的結果(假設兩個 arrays 是二維的):

A[:][:] = B[:][:]

A[:,:] = B[:,:]

我想知道是否有任何情況,解釋。

有什么提示嗎?

例子:

>>> x = numpy.array([[1, 2], [3, 4], [5, 6]])
>>> x
array([[1, 2],
       [3, 4],
       [5, 6]])
>>> x[1][1]
4                 # expected behavior
>>> x[1,1]
4                 # expected behavior
>>> x[:][1]
array([3, 4])     # huh?
>>> x[:,1]
array([2, 4, 6])  # expected behavior

讓我們退后一步。 嘗試這個:

>>> x = np.arange(6)

>>> x
array([0, 1, 2, 3, 4, 5])

>>> x[:]
array([0, 1, 2, 3, 4, 5])

>>> x[:][:]
array([0, 1, 2, 3, 4, 5])

>>> x[:][:][:][:][:][:][:][:][:][:]
array([0, 1, 2, 3, 4, 5])

看起來x[:]等於x (實際上, x[:]創建了x的副本。)

因此, x[:][1] == x[1]


這是否符合我們的預期? 為什么x[:]應該是x的副本? 如果您熟悉切片,這些示例應該可以闡明:

>>> x[0:4]
array([0, 1, 2, 3])

>>> x[0:6]
array([0, 1, 2, 3, 4, 5])

>>> x[0:]
array([0, 1, 2, 3, 4, 5])

>>> x[:]
array([0, 1, 2, 3, 4, 5])

我們可以省略06 ,numpy 將計算出我們的最大尺寸。


關於問題的第一部分,要創建B副本,您可以執行以下任何操作:

A = B[:, :]
A = B[...]
A = np.copy(B)

通常,我們使用像x,y這樣的坐標,首先是水平坐標,然后是垂直坐標。 因此, numpy通過按此順序給出兩個坐標,可以方便地訪問 2D arrays 中的元素。

但是,二維數組實際上是 arrays 的數組; 注意定義:

foo = numpy.array([
    [1, 2],
    [3, 4],
    [5, 6]
])

如果忽略numpy.array構造函數,這是一個列表列表。 外部列表包含三個元素(每個元素都是一個列表),索引 1 處的值是foo[1] == [3, 4] 這是有道理的,因為矩陣表示為rows列表,因此外部列表中使用的索引控制垂直坐標,即您訪問的行。

因此,在像foo[1][0] == 3這樣的表達式中,索引 1 是垂直坐標,而 0 是水平坐標。 也就是說,它相當於寫foo[x,y] 與通常的約定相比,它是倒退的,但它從邏輯上遵循矩陣是行列表這一事實。 如果矩陣是列列表,則foo[x][y]將是正確的。

對於numpy arrays,這同樣適用於切片運算符。 表達式foo[:][1]等價於foo[1,:] ,而不是foo[:,1]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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