1

所以目标是我试图将一些数组保存为镶木地板。我可以使用 python 调试器来达到我的代码中可以保存的点。在我复杂的代码中,它们看起来像;

ipdb> ak.__version__
'1.2.2'
ipdb> array1
<Array [... 0., 1.]], [[50.], [4., 47.]]]] type='1 * 3 * var * var * float64'>
ipdb> array2
<Array [[False, True, True]] type='1 * 3 * bool'>

如果我尝试保存它们不起作用,我得到的错误是

ipdb> group = ak.zip({'a': array1, 'b': array2}, depth_limit=1)
ipdb> ak.to_parquet(group, 'test.parquet')
*** ValueError: could not broadcast input array from shape (3) into shape (1)

所以我开始在终端里乱来尝试重新创建问题并调试它,但我实际上无法复制它。这是发生的事情;

In [1]: import awkward as ak
In [2]: ak.__version__
'1.2.2'
In [3]: cat = ak.from_iter([[True, False, True]])
In [4]: dog = ak.from_iter([[[], [[50.0], [0.2, 0.1, 0., 0., 0.1]], [[50.0], [21., 0.1, 0.]]]])
In [5]: pets = ak.zip({'dog':dog, 'cat':cat}, depth_limit=1)
In [6]: ak.to_parquet(pets, "test.parquet")
In [7]: # no problems
In [8]: cat
<Array [[False, True, True]] type='1 * var * bool'>

请注意,尺寸已从 更改1 * 3 * bool1 * var * bool。这似乎是唯一的区别 - 但我似乎无法弄清楚如何控制它?


设法隔离了这个问题,这不是我想的那样。当使用np.newaxis在布尔数组中创建一个新轴,然后尝试保存它时,问题就出现了。


dog = ak.from_iter([1, 2, 3])[np.newaxis]
pets = {"dog": dog}
zipped = ak.zip(pets, depth_limit=1)
ak.to_parquet(zipped, "test.parquet")
# works fine

dog = ak.from_iter([True, False, True])[np.newaxis]
pets = {"dog": dog}
zipped = ak.zip(pets, depth_limit=1)
ak.to_parquet(zipped, "test.parquet")

# Gives 
ValueError: could not broadcast input array from shape (3) into shape (1)

我真的应该知道最好不要在没有先隔离问题的情况下发布问题。为浪费您的时间而道歉。

4

1 回答 1

1

ak.zip中,depth_limit=1意味着数组没有深度匹配(“压缩”)在一起:唯一的约束是len(array1) == len(array2). 这不满足吗?

在您的pets示例中,len(cat) == 1并且len(dog) == 1. 既然您要depth_limit=1,那没关系len(cat[0]) == len(dog[0]),尽管在这种情况下确实如此(它们都是3)。因此,可以将它们压缩到depth_limit=2,即使这不是您所要求的。

由于错误消息是说 和 的不匹配长度是 和,array1这应该很容易在调试器中检查:array231

array1[0]
array1[1]
array1[2]   # should be the last one

array2[0]   # should be the only one

我希望这对您的问题有所帮助!


仔细观察,我发现您告诉我您知道 和 的array1长度array2。他们都是长度1。将它们拉上拉链应该没有问题depth_limit=1

您可以通过在该轴上调用ak.to_regularpets使您的示例具有完全正确的类型:

>>> cat = ak.to_regular(ak.from_iter([[True, False, True]]), axis=1)
>>> dog = ak.to_regular(ak.from_iter([[[], [[50.0], [0.2, 0.1, 0., 0., 0.1]], [[50.0], [21., 0.1, 0.]]]]), axis=1)
>>> cat
<Array [[True, False, True]] type='1 * 3 * bool'>
>>> dog
<Array [... 0, 0.1]], [[50], [21, 0.1, 0]]]] type='1 * 3 * var * var * float64'>

所以类型恰好是1 * 3 * bool1 * 3 * var * var * float64。压缩作品:

>>> pets = ak.zip({'dog':dog, 'cat':cat}, depth_limit=1)
>>> pets
<Array [... 0]]], cat: [True, False, True]}] type='1 * {"dog": var * var * var *...'>
>>> pets.type
1 * {"dog": var * var * var * float64, "cat": var * bool}

也许你认为你正在使用array1array2不是你真正正在使用的东西?

于 2021-05-07T17:49:47.850 回答