如何在不使用 for 循环的情况下创建一个新列表,其中 new_array[i][j] = b[a[i][j]](a 是一个数组,b 是一个向量)
How to create a new list where new_array[i][j] = b[a[i][j]] (with a being an array and b a vector) without using for loops
我有两个数组,例如 a = np.array([[0, 2, 0], [0, 2, 0]])
和 b = np.array([1, 1, 2])
。
我想要做的是创建一个与 a 大小相同的新数组,但其中每个条目 (i,j) 对应于列表 b 的值,索引由 a[i][j]
给出。正式地,我想要 new_list[i][j] = b[a[i][j]]
.
我知道这可以用for循环来实现,如下面的代码所示。但是,我想问一下这是否可以在没有 for 循环的情况下仅使用 Numpy 或 Python 使用代码矢量化的内置函数来实现。
a = np.array([[0, 2, 0], [0, 2, 0]])
b = np.array([0, 0, 2])
new_array = np.empty((2,3))
for i in range(len(a)):
for j in range(3):
new_array[i][j] = b[a[i][j]]
预期输出:
array([[0, 2, 0],
[0, 2, 0]])
您可以使用 numpy.take
:
np.take(b, a)
输出:
array([[0, 2, 0],
[0, 2, 0]])
非歧义示例
a = [[0, 2, 0], [1, 1, 2]]
b = [6, 7, 8]
np.take(b, a)
# array([[6, 8, 6],
# [7, 7, 8]])
我有两个数组,例如 a = np.array([[0, 2, 0], [0, 2, 0]])
和 b = np.array([1, 1, 2])
。
我想要做的是创建一个与 a 大小相同的新数组,但其中每个条目 (i,j) 对应于列表 b 的值,索引由 a[i][j]
给出。正式地,我想要 new_list[i][j] = b[a[i][j]]
.
我知道这可以用for循环来实现,如下面的代码所示。但是,我想问一下这是否可以在没有 for 循环的情况下仅使用 Numpy 或 Python 使用代码矢量化的内置函数来实现。
a = np.array([[0, 2, 0], [0, 2, 0]])
b = np.array([0, 0, 2])
new_array = np.empty((2,3))
for i in range(len(a)):
for j in range(3):
new_array[i][j] = b[a[i][j]]
预期输出:
array([[0, 2, 0],
[0, 2, 0]])
您可以使用 numpy.take
:
np.take(b, a)
输出:
array([[0, 2, 0],
[0, 2, 0]])
非歧义示例
a = [[0, 2, 0], [1, 1, 2]]
b = [6, 7, 8]
np.take(b, a)
# array([[6, 8, 6],
# [7, 7, 8]])