我对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
但是这给了我错误的输出。有什么需要帮忙的吗?
发布于 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
的每个元素(我们称它们为xval
、yval
和zval
),并将值zval
赋给bxval,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]
的值放入新数组中a
中idx
的位置来创建一个新数组。
idx
是a
中的一个值。所以它是一个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]
的值放在a
中idx
的位置,从而创建了一个新的数组。当idx
在a
上移动时,将创建一个形状(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
数组。值之间会相互覆盖。但主要的一点是,你没有得到你想要的任务。
https://stackoverflow.com/questions/16396141
复制相似问题