如何合并存储在 python 中的嵌套列表中的 numpy 数组
How to merge numpy arrays stored in a nested list in python
我有一个 numpy 数组列表,想根据数组的长度将其分成块。这是我的清单:
import numpy as np
nums=[[np.array([[1.]]), np.array([[2.]])],\
[np.array([[3.]]), np.array([[5.]])],\
[np.array([[3.], [3.]]), np.array([[8.], [9.]])],\
[np.array([[8.], [9.]]), np.array([[1.], [2.]])],\
[np.array([[5.]]), np.array([[1.]])]]
每个子列表总是有两个长度相似的数组。前两个子列表应该合并,因为它们的数组长度相同 (1
)。我只采用独特的阵列。第三个和第四个子列表应该合并,因为长度相同(2
)。这两个子列表有一个公共数组(np.array([[8.], [9.]])
),我只采用唯一数组。最后一个子列表也是另一个拆分。实际上我有几个子列表,但我想使用相同的规则来合并它们。最后,我想得到我的列表:
arri=[[np.array([[1.]]), np.array([[2.]]),\
np.array([[3.]]), np.array([[5.]])],\ # first chunk
[np.array([[3.], [3.]]), np.array([[8.], [9.]]),\
np.array([[1.], [2.]])],\ # second chunk
[np.array([[5.]]), np.array([[1.]])]] # third chunk
我尝试了以下代码但没有成功:
arri=[]
for i in range (len (nums)-1):
if (len(nums[i][0]) == len(nums[i+1][0]) and
any((nums[i+1][0] == x).all() for x in nums[i])):
arri.append ([nums[i], nums[i+1]])
提前,我非常感谢任何帮助。
听起来你想 groupby
然后 flatten
:
from itertools import groupby
def flatten(xss):
return [x for xs in xss for x in xs]
key = lambda x: (x[0].size, x[1].size)
results = [flatten(g) for _, g in groupby(nums, key)]
为了进一步只保留每一行中唯一的数组,可以使用 dict
:
unique_results = [
list({tuple(x.reshape(-1)): x for x in xs}.values()) for xs in results
]
给出:
[
[ array([[1.]]), array([[2.]]), array([[3.]]), array([[5.]]) ],
[ array([[3.], [3.]]), array([[8.], [9.]]), array([[1.], [2.]]) ],
[ array([[5.]]), array([[1.]]) ],
]
我有一个 numpy 数组列表,想根据数组的长度将其分成块。这是我的清单:
import numpy as np
nums=[[np.array([[1.]]), np.array([[2.]])],\
[np.array([[3.]]), np.array([[5.]])],\
[np.array([[3.], [3.]]), np.array([[8.], [9.]])],\
[np.array([[8.], [9.]]), np.array([[1.], [2.]])],\
[np.array([[5.]]), np.array([[1.]])]]
每个子列表总是有两个长度相似的数组。前两个子列表应该合并,因为它们的数组长度相同 (1
)。我只采用独特的阵列。第三个和第四个子列表应该合并,因为长度相同(2
)。这两个子列表有一个公共数组(np.array([[8.], [9.]])
),我只采用唯一数组。最后一个子列表也是另一个拆分。实际上我有几个子列表,但我想使用相同的规则来合并它们。最后,我想得到我的列表:
arri=[[np.array([[1.]]), np.array([[2.]]),\
np.array([[3.]]), np.array([[5.]])],\ # first chunk
[np.array([[3.], [3.]]), np.array([[8.], [9.]]),\
np.array([[1.], [2.]])],\ # second chunk
[np.array([[5.]]), np.array([[1.]])]] # third chunk
我尝试了以下代码但没有成功:
arri=[]
for i in range (len (nums)-1):
if (len(nums[i][0]) == len(nums[i+1][0]) and
any((nums[i+1][0] == x).all() for x in nums[i])):
arri.append ([nums[i], nums[i+1]])
提前,我非常感谢任何帮助。
听起来你想 groupby
然后 flatten
:
from itertools import groupby
def flatten(xss):
return [x for xs in xss for x in xs]
key = lambda x: (x[0].size, x[1].size)
results = [flatten(g) for _, g in groupby(nums, key)]
为了进一步只保留每一行中唯一的数组,可以使用 dict
:
unique_results = [
list({tuple(x.reshape(-1)): x for x in xs}.values()) for xs in results
]
给出:
[
[ array([[1.]]), array([[2.]]), array([[3.]]), array([[5.]]) ],
[ array([[3.], [3.]]), array([[8.], [9.]]), array([[1.], [2.]]) ],
[ array([[5.]]), array([[1.]]) ],
]