我如何对一些用作索引的数组进行索引?我有如下的二维数组:
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
但这给了我错误的输出。
2条答案
按热度按时间cbwuti441#
工作原理:
如果你在赋值语句中用两个numpy数组来索引
b
然后将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] = 10
不起作用当你写
b[a]
时,把NumPy看作是通过移动a
的每个元素(我们称每个元素为idx
)来创建一个新数组,并把b[idx]
的值放在a
中idx
的位置。idx
是a
中的值。因此它是int32。b
的形状为(6,3),因此b[idx]
是b
的形状为(3,)的行。例如,当idx
为b[a[1,1]]
是所以
我们再重复一遍:NumPy正在创建一个新数组,方法是移动
a
的每个元素,并将b[idx]
的值放入新数组中a
中idx
的位置。当idx
移动到a
上时,将生成一个形状为但由于b[idx]
本身的形状为(3,),因此在形状为(6,2)的数组中的每个位置都放置了形状为(3,)的值,结果是形状为(6,2,3)的数组。现在,当你做一个
形状的临时阵列(6,2,3),然后执行赋值。由于10是常数,因此此赋值将值10放置在(6,2,3)形状的数组。然后临时数组中的值被重新分配回
b
。请参阅参考文档。因此(6,2,3)型数组被复制回(6,3)型b
数组。值会相互覆盖。但主要的一点是,你没有得到你想要的赋值。gijlo24d2#
您也可以转置索引数组
a
,将结果转换为元组,然后为数组b
建立索引并赋值。将索引数组转换为元组可确保多维索引按预期工作。所有这些都产生预期输出