如何在不使用 for 循环的情况下创建一个新列表,其中 new_array[i][j] = b[a[i][j]](a 是数组,b 是向量)

Posted

技术标签:

【中文标题】如何在不使用 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 【发布时间】:2021-12-17 23:48:33 【问题描述】:

我有两个数组,例如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]])

【问题讨论】:

在 python 中,listarraynumpy.ndarray 的缩写)是不同的类。我更喜欢主题行和变量名并没有混淆两者。在您的代码中,ab 是列表,new_list 是一个数组。可以使用new_list[i,j] 对其进行索引。 【参考方案1】:

你可以使用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]])

【讨论】:

以上是关于如何在不使用 for 循环的情况下创建一个新列表,其中 new_array[i][j] = b[a[i][j]](a 是数组,b 是向量)的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 for 循环的情况下将列表中的所有项目与整数进行比较

如何在不使用 for 循环的情况下从列表中删除元素?

如何在不跟踪索引的情况下将元素附加到列表中?

如何在不使用swiftUI附带的幻灯片删除的情况下创建自定义删除按钮我没有使用列表,只是使用foreach循环

如何在不跟踪索引的情况下将元素附加到列表?

在 Robot Framework 中找不到 IN 关键字。如何在不使用 IN 关键字的情况下使用 for 循环?