Python Numpy 2D数组索引

Python Numpy 2D数组索引,第1张

Python Numpy 2D数组索引
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
数组中。值彼此覆盖。但要点是您没有获得所需的任务。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5653729.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存