[英]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
每個元素(讓我們稱之為xval
, yval
和zval
),並將值[ zval
]賦值給b [xval,yval]。 當z
是常數時,“在z
移動只是每次返回相同的值。
這就是我們想要的,與x
是第一列a
和y
是第二列a
。 因此,選擇x = a[:, 0]
,並且y = a[:, 1]
。
b[a[:,0], a[:,1]] = 10
為什么b[a] = 10
不起作用
當編寫b[a]
認為NumPy的,如通過移動超過的每個元素創建新陣列a
,(我們稱之為每一個idx
)和新的陣列中放置的值b[idx]
在的位置idx
在a
。
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]
在的位置idx
中a
。 當idx
在a
移動時,將創建一個形狀(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.