2014-08-28 72 views
3

我越来越想(二进制)保存在Python 2 某些阵列我已分离出错误时,一个奇怪的错误,特别是假设的Python NumPy的不节能阵列()

p1 = [1, 5, 10, 20] 
p2 = [1, 5, 10, 20, 30]  
p3 =np.zeros((5,10), dtype=float) 

然后

np.save("foo1", (p1, p2)) 
np.save("foo2", (p1, p3)) 

工程确定,但

np.save("foo3", (p2, p3)) 

返回一个错误 enter image description here

任何想法发生了什么? 错误说“使用序列设置数组元素” 尝试环顾四周,转换数组等等,但无济于事。 什么是有趣的是,作为中提到的第一个省都OK,和P1是非常相似的P2 ...

回答

4

的错误不是由于np.save,但试图创建嵌套序列的阵列来了。我得到一个类似但不同的错误,可能是因为我工作的开发版本,使用任何np.array变体:

>>> np.array((p2, p3)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: could not broadcast input array from shape (5,10) into shape (5) 

不知道这是否有资格作为一个bug,但什么是跳闸numpy的是事实,第一维p2p3是一样的,5在你的情况。所以numpy认为它应该创建一个形状为(2, 5, ...)的数组arr。然后它将p2中的值分配给arr[0, :]而没有任何问题。但是,当它试图将p3中的值分配给arr[1, :]时,就是发生错误时:您正在尝试将其锁定到单个位置,例如, arr[1, 0]p3[0, :]中的5个元素。

Numpy可能会对此更聪明,并且不会认为匹配维度意味着所有序列的深度都是相同的,因为它似乎在做。您可能想要查看numpy邮件列表,看看其中一位开发人员是否对这是否是不良行为或设计选择有更明智的看法。

+2

Thanx的答案。这可能会导致一个只发生很少的错误......当保存多个数组时,可能需要添加一个空数组以确保没有任何错误,那么,例如, np.save(“foo4”,(“data_for_foo”,p2,p3)) – ntg 2014-08-29 17:46:30