二维数组中的单个向量多次

Single vector multiple times in 2d array

这是我的代码:

b = [6 * [1, 3, 4, 2],
 4 * [2, 1, 4, 3],
 3 * [3, 4, 2, 1],
 4 * [4, 2, 1, 3],
 4 * [4, 3, 2, 1],
 ]

其中 returns 一个数组,第一行有 6X4=24 个元素,第二行有 4X4=16 个元素,依此类推...

我想要实现的是多次添加完全相同的行,例如:

1, 3, 4, 2
1, 3, 4, 2
1, 3, 4, 2
1, 3, 4, 2
1, 3, 4, 2
1, 3, 4, 2 #6 tines the first line
2, 1, 4, 3
2, 1, 4, 3
2, 1, 4, 3
2, 1, 4, 3 # 4 times the second
..........

但当然不是一次又一次地复制同一行

尝试:

b = [
    *[[1, 3, 4, 2] for _ in range(6)],
    *[[2, 1, 4, 3] for _ in range(4)],
    *[[3, 4, 2, 1] for _ in range(3)],
    *[[4, 2, 1, 3] for _ in range(4)],
    *[[4, 3, 2, 1] for _ in range(4)],
]

print(b)

打印:

[
    [1, 3, 4, 2],
    [1, 3, 4, 2],
    [1, 3, 4, 2],
    [1, 3, 4, 2],
    [1, 3, 4, 2],
    [1, 3, 4, 2],
    [2, 1, 4, 3],
    [2, 1, 4, 3],
    [2, 1, 4, 3],
    [2, 1, 4, 3],
    [3, 4, 2, 1],
    [3, 4, 2, 1],
    [3, 4, 2, 1],
    [4, 2, 1, 3],
    [4, 2, 1, 3],
    [4, 2, 1, 3],
    [4, 2, 1, 3],
    [4, 3, 2, 1],
    [4, 3, 2, 1],
    [4, 3, 2, 1],
    [4, 3, 2, 1],
]

也可以和

放在一行
b = 6*[[1, 3, 4, 2]] + 4*[[2, 1, 4, 3]] + 3*[[3, 4, 2, 1]] + 4*[[4, 2, 1, 3]] + 4* [[4, 3, 2, 1]])

print(b)

如果您不想更改 b 的创建方式,只需两步。

import numpy as np 

B = np.concatenate(b).ravel()
b = np.reshape(B,(21,4))

您可以使用列表理解的列表理解来重复 y 次您的 x 列表(分别来自 bbaa

写法有点奇怪,“中心”是外层元素,然后向右展开。

优点:不需要 numpy,它适用于任何大小的条目,这与其他答案“硬编码”行不同

aa=[[1, 3, 4, 2],
[2, 1, 4, 3],
[3, 4, 2, 1],
[4, 2, 1, 3],
[4, 3, 2, 1]]

bb=[6,4,3,4,4]

xx = [x for x,y in zip(aa,bb) for _ in range(y) ]

returns: [[1, 3, 4, 2], [1, 3, 4, 2], [1, 3, 4, 2], [1, 3, 4, 2], [1, 3, 4, 2] , [1, 3, 4, 2], [2, 1, 4, 3], [2, 1, 4, 3], [2, 1, 4, 3], [2, 1, 4, 3] , [3, 4, 2, 1], [3, 4, 2, 1], [3, 4, 2, 1], [4, 2, 1, 3], [4, 2, 1, 3] , [4, 2, 1, 3], [4, 2, 1, 3], [4, 3, 2, 1], [4, 3, 2, 1], [4, 3, 2, 1] , [4, 3, 2, 1]]

可以通过将因子和子列表配对并将它们相乘来系统地完成。然后放平列表。

这里是hacky-way

b = [[1, 3, 4, 2],
 [2, 1, 4, 3],
 [3, 4, 2, 1],
 [4, 2, 1, 3],
 [4, 3, 2, 1],
 ]

factors = [6, 4, 3, 4, 4]

print(sum(f*[l] for f, l in zip(factors, b), []))

展平部分(列表链接)是用 sum( , []) 完成的,但 不是 性能(并为此设计)......但仍然有用,在我的意见,即时测试一些小东西。列表链接 必须完成 ,即 itertools.chain。举个例子

import itertools as it
...
list(it.chain.from_iterable(f*[l] for f, l in zip(factors, b)))

# or (for many iterators)
list(it.chain(*(f*[l] for f, l in zip(factors, b))))

# or with repeat
list(it.chain.from_iterable(it.starmap(it.repeat, zip(b, factors))))

# or (another) with repeat
list(it.chain.from_iterable(map(it.repeat, b, factors))

# or ...
list(it.chain.from_iterable(map(list.__mul__, ([i] for i in b) , factors)))

# or with reduce
import functools as fc

list(fc.reduce(lambda i, j: i + j, zip(b, factors)))