繁体   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