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

时间:2014-01-31 12:53:58

标签: python arrays numpy

假设我有一个矩阵B:

B = [
    [0, 1, 2],
    [2, 3, 4],
    [5, 6, 7]
]

和矢量a:

a = [0,0,1,1,2]

我需要定义一个新的向量C,使得它重复B中的行,如a,即,

所指定的那样。
C = [
    [0, 1, 2],
    [0, 1, 2],
    [2, 3, 4]
    [2, 3, 4],
    [5, 6, 7]
]

在Python中是否有一个技巧命令来执行此操作?

2 个答案:

答案 0 :(得分:4)

您可以在此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]])

>>> 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]]

来自index array

  

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

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

[:]

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

答案 1 :(得分:0)

使用map()迭代a的所有元素,并从B获取相应的列表:

C = map(lambda x: B[x], a)

请注意C的元素只会引用B行。这可能是您想要的行为。如果您需要元素的真实副本,可以在lambda中返回B[x][:]以进行一次复制,或使用copy.deepcopy()获取完整副本。