我想弄清楚为什么以下代码不起作用:
import numpy as np
failList = [[[1], [2]],
[[3, 4, 5, 6], [7]],
[[8], [9]],
[[10], [11, 12]],
[[13], [14, 15, 16]]]
goodList = [[[1], [2], [3, 4, 5, 6], [7], [8]],
[[9], [10], [11, 12], [13], [14, 15, 16]]]
goodList2 = [[[1], [2], [3, 4, 5, 6], [7], [8]],
[[9], [10], [11, 12], [13], [14, 15, 16]],
[[9], [10], [11, 12], [13], [14, 15, 16]]]
myLists = [failList, goodList, goodList]
for l in myLists:
print([len(l[i]) for i in range(len(l))])
print([len(l[i][j]) for i in range(len(l)) for j in range(len(l[i]))])
try:
np.concatenate(l)
print("worked")
except:
print("failed")
输出为:
^{pr2}$有人能解释一下,为什么第一个列表不能连接,而其他列表可以连接?在
原始答案(错误):
根据docs:
第一个列表的属性是内部列表的长度不同(分别为6和4)。在你的好列表中,所有内部列表的长度都是相同的5。在
编辑:对不起,我没有注意到其中的一个括号,所以我错误地将您的
failList
的形状视为错误。在正确答案是,在故障列表中,子列表的形状不同:
连接元组(或列表)中的列表应该具有相同的维度。在
您可以在实现^{cd1>}的github source code中看到第399行。在
PyArray_NDIM
do给出所有维度的长度在您的例子中,
^{pr2}$failList
中的列表没有相同的维度。 您可以通过下面的代码进行检查。在concatenate
从每个列表元素生成一个数组,然后将它们连接到所需的轴上。如果形状不匹配,则会引发错误:failedList
的元素对于不同类型的数组,有些是二维数值的,有些是一维对象。concatenate
无法加入这些。在
^{pr2}$column_stack
有效:这是因为它将(2,)形状的数组整形为(2,1)。现在它有一个5(2,1)数组的列表,它可以在第二维度上连接这些数组,从而生成一个(2,5)数组。但请注意,它是object dtype。有些元素是整数,有些是列表(大小不同)。在
相关问题 更多 >
编程相关推荐