Python 花式索引的Numpy循环广播

Python 花式索引的Numpy循环广播,python,numpy,broadcast,Python,Numpy,Broadcast,A是一个numpy数组,具有(6,8) 我想: x_id = np.array([0, 3]) y_id = np.array([1, 3, 4, 7]) A[ [x_id, y_id] += 1 # this doesn't actually work. 像::2这样的技巧不会奏效,因为索引不会定期增加 我不想使用额外的内存重复[0,3]并创建一个新数组[0,3,0,3],因为这样做很慢 这两个维度的索引长度不相等 这相当于: A[0, 1] += 1 A[3, 3] += 1 A[0,

A
是一个
numpy
数组,具有
(6,8)

我想:

x_id = np.array([0, 3])
y_id = np.array([1, 3, 4, 7])

A[ [x_id, y_id] += 1  # this doesn't actually work.
::2
这样的技巧不会奏效,因为索引不会定期增加

我不想使用额外的内存重复
[0,3]
并创建一个新数组
[0,3,0,3]
,因为这样做很慢

这两个维度的索引长度不相等

这相当于:

A[0, 1] += 1
A[3, 3] += 1
A[0, 4] += 1
A[3, 7] += 1
numpy
可以这样做吗

更新:


不确定
broadcast\u to
stride\u tricks
是否比嵌套的python循环快。()

您可以将
y\u id
转换为第二维度与
x\u id
相同的2d数组,然后由于维度差异,两个索引将自动广播:

x_id = np.array([0, 3])
y_id = np.array([1, 3, 4, 7])
​
A = np.zeros((6,8))
A[x_id, y_id.reshape(-1, x_id.size)] += 1 

A
array([[ 0.,  1.,  0.,  0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])

您可以将
y\u id
转换为第二维度与
x\u id
相同的二维数组,然后由于维度差异,两个索引将自动广播:

x_id = np.array([0, 3])
y_id = np.array([1, 3, 4, 7])
​
A = np.zeros((6,8))
A[x_id, y_id.reshape(-1, x_id.size)] += 1 

A
array([[ 0.,  1.,  0.,  0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])

听起来好极了。。。实际阵列是6维的。让我试试。听起来好极了。。。实际阵列是6维的。让我试试。希望存在:希望存在: