簡體   English   中英

Python numpy 2D數組索引

[英]Python numpy 2D array indexing

我對python和numpy很新。 有人可以幫我理解如何對一些用作索引的數組進行索引。 我有以下六個這樣的2D陣列 -

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

我想使用這些數組作為索引,並將值10放在新空矩陣的相應索引中。 輸出應如下所示 -

array([[ 0,  0,  0],
   [ 0,  0,  0],
   [10,  0,  0],
   [10, 10,  0],
   [ 0,  0,  0],
   [10, 10, 10]])

到目前為止,我試過這個 -

    from numpy import*
    a = array([[2,0],[3,0],[3,1],[5,0],[5,1],[5,2]])
    b = zeros((6,3),dtype ='int32')
    b[a] = 10

但這給了我錯誤的輸出。 任何幫助請。

In [1]: import numpy as np
In [2]: a = np.array([[2,0],[3,0],[3,1],[5,0],[5,1],[5,2]])
In [3]: b = np.zeros((6,3), dtype='int32')

In [4]: b[a[:,0], a[:,1]] = 10

In [5]: b
Out[5]: 
array([[ 0,  0,  0],
       [ 0,  0,  0],
       [10,  0,  0],
       [10, 10,  0],
       [ 0,  0,  0],
       [10, 10, 10]])

為什么會這樣:

如果在賦值中使用兩個 numpy數組索引b

b[x, y] = z

然后將NumPy想象為同時移動x每個元素和y每個元素以及z每個元素(讓我們稱之為xvalyvalzval ),並將值[ zval ]賦值給b [xval,yval]。 z是常數時,“在z移動只是每次返回相同的值。

這就是我們想要的,與x是第一列ay是第二列a 因此,選擇x = a[:, 0] ,並且y = a[:, 1]

b[a[:,0], a[:,1]] = 10

為什么b[a] = 10不起作用

當編寫b[a]認為NumPy的,如通過移動超過的每個元素創建新陣列a ,(我們稱之為每一個idx )和新的陣列中放置的值b[idx]在的位置idxa

idx是在一個值a 所以這是一個int32。 b具有形狀(6,3),因此b[idx]是一排b形狀(3,)。 例如,當idx

In [37]: a[1,1]
Out[37]: 0

b[a[1,1]]

In [38]: b[a[1,1]]
Out[38]: array([0, 0, 0])

所以

In [33]: b[a].shape
Out[33]: (6, 2, 3)

因此,讓我們重復:NumPy的是通過移動過的每個元素創建新陣列a和新的陣列中放置的值b[idx]在的位置idxa idxa移動時,將創建一個形狀(6,2)的數組。 但由於b[idx]本身就是形狀(3,),所以在(6,2)形陣列中的每個位置都放置一個(3,)形狀的值。 結果是一個形狀數組(6,2,3)。

現在,當你做一個像

b[a] = 10

創建具有值b[a]的臨時形狀數組(6,2,3),然后執行賦值。 由於10是常量,因此該賦值將值10放在(6,2,3)形數組中的每個位置。 然后將臨時數組中的值重新分配回b 請參閱文檔參考 因此,(6,2,3)形數組中的值被復制回(6,3)形b數組。 值互相覆蓋。 但重點是你沒有獲得你想要的任務。

暫無
暫無

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

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