![](/img/trans.png)
[英]NumPy - What is the difference between frombuffer and fromstring?
[英]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])
我們可以省略0
和6
,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.