我正在学习numpy框架。我不理解这段代码。
import numpy as np
a =np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
print(a)
row = np.array([[0,0],[3,3]])
col = np.array([[0,2],[0,2]])
b = a[row,col]
print("This is b array:",b)
此b
数组返回a
数组的角值,即b
等于[[0,2],[9,11]]
。
答案 0 :(得分:4)
当使用数组或“类似数组的”索引完成访问或修改数组元素时,这称为高级索引。
In [37]: a
Out[37]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
In [38]: row
Out[38]:
array([[0, 0],
[3, 3]])
In [39]: col
Out[39]:
array([[0, 2],
[0, 2]])
In [40]: a[row, col]
Out[40]:
array([[ 0, 2],
[ 9, 11]])
这就是你所得到的。以下是说明:
Indices of
`a[row, col]` row column
|| || || ||
VV VV VV VV
a[0, 0] a[0, 2]
a[3, 0] a[3, 2]
|__________| |
row-idx array |
|__________|
column-idx array
答案 1 :(得分:2)
您正在使用两个形状相同的a
来索引2d-arrays
,因此输出数组的形状也将与col
和row
相同。为了更好地了解array indexing
的工作方式,您可以检查docs,如图所示,在给定数组的现有轴上使用1d-arrays
进行索引操作如下:
result [i_1,...,i_M] == x [ind_1 [i_1,...,i_M],ind_2 [i_1,...,i_M], ...,ind_N [i_1,...,i_M]]
在每个轴上用2d-arrays
进行索引的情况下,适用相同的逻辑,但是相反,您将有一个result
数组,其中最多包含i_N_M
个索引。
因此,回到示例中,您实际上是在基于a
的{{1}}行中进行选择,而从row
的行中则选择了rows
列。您可能会发现将行和列索引转换为col
坐标会更直观:
(x,y)
通过相应地从(0,0), (0,2)
(3,0), (3,2)
中进行选择,将得到输出数组:
a
答案 2 :(得分:0)
您可以通过尝试更多的例子来了解它。
如果您有一维索引:
In [58]: np.arange(10)[np.array([1,3,4,6])]
Out[58]: array([1, 3, 4, 6])
在二维索引的情况下:
In [57]: np.arange(10)[np.array([[1,3],[4,6]])]
Out[57]:
array([[1, 3],
[4, 6]])
如果使用3维索引:
In [59]: np.arange(10)[np.array([[[1],[3]],[[4],[6]]])]
Out[59]:
array([[[1],
[3]],
[[4],
[6]]])
如您所见,如果在索引中建立层次结构,则也会在输出中得到它。
答案 3 :(得分:0)
分步进行:
bananaBasket.addAll(List(Orange()))
提供2d数组import numpy as np
a = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
print(a)
:
a
然后:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
分配给二维数组row = np.array([[0,0],[3,3]])
值row
和[0,0]
:
[3,3]
然后:
array([[0, 0],
[3, 3]])
分配给二维数组col = np.array([[0,2],[0,2]])
值col
和[0,2]
:
[0,2]
最后:
array([[0, 2],
[0, 2]])
为第一行分配b = a[row,col]
,b
的{{1}}值,为第二行分配a[0,0]
,a[0,2]
的值,即:>
a[3,0]
a[3,2]
<- array([[ 0, 2],
[ 9, 11]])
来自哪里?它来自b[0,0]
为0和a[0,0]
为0的组合。
row[0,0]
<-col[0,0]
呢?它来自b[0,1]
为0和a[0,2]
为2的组合。
依此类推。