将两个numpy数组合并为一个列表,其中每个元素是一个包含多个元组的列表。

3
我还没有弄清楚这个问题。谢谢帮助。
现有的:
>>> x = np.array([[1,2],[5,6]])
>>> x
array([[1, 2],
       [5, 6]])
>>> y = np.array([[3,4],[7,8]])
>>> y
array([[3, 4],
       [7, 8]])

希望:

>>> z = [[(1,2),(3,4)],[(5,6),(7,8)]]
>>> z
[[(1, 2), (3, 4)], [(5, 6), (7, 8)]]

可能是将numpy数组转换为元组的重复问题。 - gdlmx
6个回答

3

试试这个:

x_z = map(tuple,x)
y_z = map(tuple,y)
[list(i) for i in zip(x_z, y_z)]

输出:

[[(1, 2), (3, 4)], [(5, 6), (7, 8)]]

1
谢谢,这看起来是最直接的解决方案。 - llevar

2

这是一个有趣的问题。我想到了以下解决方案:

最初的回答:

print([list(map(tuple, i)) for i in zip(x, y)])
# [[(1, 2), (3, 4)], [(5, 6), (7, 8)]]

基本上,将x和y压缩在一起会得到:

最初的回答

[(array([1, 2]), array([3, 4])), (array([5, 6]), array([7, 8])]

接着,您需要将每个元素首先转换为一个列表,然后再转换为一个元组

。将原始答案翻译为“最初的回答”。

0

如果你想遍历每个矩阵的行,可以这样做:

for (row1, row2) in zip(x,y):
    yield [tuple(row1), tuple(row2)]
       #  [ (1,2)     ,  (3,4)     ]

这将给你一个生成器(如果你将它包装在一个函数中),但是你想要一个列表。所以,相反地,将其包装在一个推导式中:
[ [tuple(row1),tuple(row2)] for (row1, row2) in zip(x,y) ]

1
你应该明确指出yield版本需要在函数定义内部。 - gold_cy

0
x = list([[1,2],[5,6]])
y = list([[3,4],[7,8]])
x
[[1, 2], [5, 6]]
y
[[3, 4], [7, 8]]
z=list(zip(x,y))
z
[([1, 2], [3, 4]), ([5, 6], [7, 8])]

谢谢,但是这会生成一个列表的元组列表,而不是所请求的元组列表的列表。 - llevar

0

IIUC

z=np.array([x,y])
[list(map(tuple,z[:,x]))for x in range(len(x))]
Out[223]: [[(1, 2), (3, 4)], [(5, 6), (7, 8)]]

-1

就算不值得一提,这里是最简单和最有效的(但可能是最不通用的)解决方案:

result = [[(x[0,0], x[0,1]), (y[0,0], y[0,1])],
         [(x[1,0], x[1,1]), (y[1,0], y[1,1])]]

输出:

[[(1, 2), (3, 4)], [(5, 6), (7, 8)]]

可以承认,这并没有概括性,但问题是——需要概括到哪个方向呢?更长的外维度?更长的内维度?该问题并未要求进行任何概括。

基于明确说明的需求,当然可以修改此解决方案,使其具有所需的概括性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接