In [1]: import numpy as npIn [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]] = 10In [5]: bOut[5]: array([[ 0, 0, 0], [ 0, 0, 0], [10, 0, 0], [10, 10, 0], [ 0, 0, 0], [10, 10, 10]])
工作原理:
如果您在工作分配中
b使用 两个 numpy数组建立索引,
b[x, y] = z
然后认为NumPy的作为过的各元件同时移动
x和中的每个元素
y和中的每个元素
z(我们称它们
xval,
yval和
zval),并分配至b
[XVAL,利用yval]的值
zval。当
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]在的位置
idx中
a。
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].shapeOut[33]: (6, 2, 3)
因此,让我们再次重申:NumPy的是通过创建的每个元素移动在新的阵列
a和新阵列中放置的价值
b[idx]在的位置
idx中
a。随着
idx移动
a,将创建形状为(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数组中。值彼此覆盖。但要点是您没有获得所需的任务。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)