尴尬1;如何将数组维度设置为变量?
awkward1; how to set array dimension as variable?
我的目标是尝试将一些数组保存为镶木地板。
我可以使用 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 * bool
更改为 1 * 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)
我真的应该知道 post 一个问题而不首先隔离问题。抱歉浪费您的时间。
在 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
和 array2
的不匹配长度是 3
和 1
,所以在调试器中应该很容易检查:
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_regular 使您的 pets
示例具有完全正确的类型:
>>> 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 * bool
和 1 * 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}
也许您认为正在使用的 array1
和 array2
并不是您真正使用的?
我的目标是尝试将一些数组保存为镶木地板。 我可以使用 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 * bool
更改为 1 * 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)
我真的应该知道 post 一个问题而不首先隔离问题。抱歉浪费您的时间。
在 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
和 array2
的不匹配长度是 3
和 1
,所以在调试器中应该很容易检查:
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_regular 使您的 pets
示例具有完全正确的类型:
>>> 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 * bool
和 1 * 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}
也许您认为正在使用的 array1
和 array2
并不是您真正使用的?