根据索引向量在numpy中重复行

Bra*_*avo 3 python arrays numpy

假设我有一个矩阵 B:

B = [
    [0, 1, 2],
    [2, 3, 4],
    [5, 6, 7]
]
Run Code Online (Sandbox Code Playgroud)

和向量 a:

a = [0,0,1,1,2]
Run Code Online (Sandbox Code Playgroud)

我需要定义一个新的向量 C 以便它按照 a 的指定重复 B 中的行,即,

C = [
    [0, 1, 2],
    [0, 1, 2],
    [2, 3, 4]
    [2, 3, 4],
    [5, 6, 7]
]
Run Code Online (Sandbox Code Playgroud)

在 Python 中是否有一个技巧命令可以做到这一点?

Ash*_*ary 5

您可以在此处a用作索引数组

>>> import numpy as np
>>> b = np.array([
    [0, 1, 2],
    [2, 3, 4],
    [5, 6, 7]
])
>>> a = [0,0,1,1,2]
>>> b[a]
array([[0, 1, 2],
       [0, 1, 2],
       [2, 3, 4],
       [2, 3, 4],
       [5, 6, 7]])
Run Code Online (Sandbox Code Playgroud)

文档中

对于索引数组的所有情况,返回的是原始数据的副本,而不是切片的视图。

在纯 Python 中,您可以使用列表推导式:

>>> B = [
    [0, 1, 2],
    [2, 3, 4],
    [5, 6, 7]
]
>>> [B[x][:] for x in a]
[[0, 1, 2], [0, 1, 2], [2, 3, 4], [2, 3, 4], [5, 6, 7]]
Run Code Online (Sandbox Code Playgroud)

请注意,[:]返回列表的浅表副本,如果列表包含可变对象,则您必须使用它copy.deepcopy来获取全新的副本。