将 numpy 数组逐行替换为另一个 numpy 数组的值



我在三维 numpy 数组中存储了0s 和1s:

g = np.array([[[0, 1], [0, 1], [1, 0]], [[0, 0], [1, 0], [1, 1]]])
# array([
#     [[0, 1], [0, 1], [1, 0]],
#     [[0, 0], [1, 0], [1, 1]]])

我想使用逐行替换策略将这些值替换为另一个数组中的值。例如,将g的数值替换为x

x = np.array([[2, 3], [4, 5]])
array([[2, 3],
[4, 5]])

获得:

array([
[[2, 3], [2, 3], [3, 2]],
[[4, 4], [5, 4], [5, 5]]])

这里的想法是将第一行g替换为x的第一个元素(0变得21变得3(,另一行也是如此(第一维 - "行"的数量 - 对于gx将始终相同(

我似乎无法使用np.where,因为有一个ValueError: operands could not be broadcast together with shapes (2,3,2) (2,2) (2,2).

IIUC,

np.stack([x[i, g[i]] for i in range(x.shape[0])])

输出:

array([[[2, 3],
[2, 3],
[3, 2]],
[[4, 4],
[5, 4],
[5, 5]]])

矢量化方法,使用axis=-1np.take_along_axis索引到x的最后一个轴,g-

In [20]: np.take_along_axis(x[:,None],g,axis=-1)
Out[20]: 
array([[[2, 3],
[2, 3],
[3, 2]],
[[4, 4],
[5, 4],
[5, 5]]])

或者使用基于整数的手动索引 -

In [27]: x[np.arange(len(g))[:,None,None],g]
Out[27]: 
array([[[2, 3],
[2, 3],
[3, 2]],
[[4, 4],
[5, 4],
[5, 5]]])

一种解决方案是直接在此处使用理解:

>>> np.array([[x[i][c] for c in r] for i, r in enumerate(g)])
array([[[2, 3],
[2, 3],
[3, 2]],
[[4, 4],
[5, 4],
[5, 5]]])

据我了解,g 是一个索引数组(索引为 0 或 1(,x 是您使用谁的值的数组。

这样的东西应该可以工作(快速测试(

import numpy as np
def swap_indexes(index_array, array):
out_array = []
for i, row in enumerate(index_array):
out_array.append([array[i,indexes] for indexes in row])
return np.array(out_array)

index_array = np.array([[[0, 1], [0, 1], [1, 0]], [[0, 0], [1, 0], [1, 1]]])
x = np.array([[2, 3], [4, 5]])
print(swap_indexes(index_array, x))

[编辑:修复了创建重复项的拼写错误]

最新更新