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维的。让我试试。希望存在:希望存在: