首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python numpy 2D数组索引

Python numpy 2D数组索引
EN

Stack Overflow用户
提问于 2013-05-06 17:51:35
回答 1查看 91K关注 0票数 37

我对python和numpy还是个新手。有没有人可以帮助我理解如何对一些用作索引的数组进行索引。我有以下六个这样的二维数组:

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

但是这给了我错误的输出。有什么需要帮忙的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-06 17:55:28

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赋给bxval,yval。当z是一个常量时,“在z上移动每次只返回相同的值。

这就是我们想要的,xa的第一列,ya的第二列。因此,选择x = a[:, 0]y = a[:, 1]

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

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

当您编写b[a]时,可以将NumPy看作是通过移动a的每个元素(让我们称每个元素为idx)并将b[idx]的值放入新数组中aidx的位置来创建一个新数组。

idxa中的一个值。所以它是一个int32。b的形状为(6,3 ),因此b[idx]是形状(3,)的一行b。例如,当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]的值放在aidx的位置,从而创建了一个新的数组。当idxa上移动时,将创建一个形状(6,2)数组。但由于b[idx]本身的形状为(3,),因此在(6,2)-shaped数组中的每个位置都放置了一个(3,)-shaped值。结果是一个形状数组(6,2,3)。

现在,当你进行像这样的赋值

b[a] = 10

创建一个值为b[a]的临时形状数组(6,2,3),然后执行赋值。由于10是一个常量,此赋值将值10放在(6,2,3)-shaped数组中的每个位置。然后将临时数组中的值重新分配回b。参见reference to docs。因此,将(6,2,3)-shaped数组中的值复制回(6,3)-shaped b数组。值之间会相互覆盖。但主要的一点是,你没有得到你想要的任务。

票数 57
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16396141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档