我遇到了np.save()
的某些意外行为。
假设您要将两个numpy数组保存到一个.npy
文件中(作为一个对象)。只要两个数组的形状相同,就可以正常工作,但是当前导尺寸相同时会发生错误。
该问题是由np.asanyarray()
引起的,在保存之前在np.save()
中调用了该问题。
显然,例如可以通过以下方式解决该问题。保存到不同的文件中,但是我不想寻找其他解决方案,我想了解np.save()
的这种行为。
代码如下:
import numpy as np
a = np.zeros((10, 5))
b = np.zeros((10, 2))
np.save('test', [a, b])
导致此错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/python3/lib/python3.6/site-packages/numpy/lib/npyio.py", line 509, in save
arr = np.asanyarray(arr)
File "/python3/lib/python3.6/site-packages/numpy/core/numeric.py", line 544, in asanyarray
return array(a, dtype, copy=False, order=order, subok=True)
ValueError: could not broadcast input array from shape (10,5) into shape (10)
当前导尺寸不同时,没有问题:
a = np.zeros((9, 5))
b = np.zeros((10, 2))
np.save('test', [a, b])
对我来说np.save
的这种行为是不一致的,似乎是一个错误。
答案 0 :(得分:0)
看到asanarray
方法here的来源(save
方法在内部对其进行调用)之后,我看到它试图制作一个ndarray
的列表,该列表使用array
方法。现在,如果它们具有不同的维度,则可以制作一个包含2个不同元素的ndarray。但是,如果它们具有相同的领先维度,它将尝试将它们一起广播到相同的ndarray
中。这是因为默认情况下它会尝试进行高维输出。为了解决这个问题,您可以首先使用empty
方法来指定尺寸,然后使用它来替代值,例如:
a=np.zeros((10,5))
b=np.zeros((10,2))
c=[a,b]
finalc = np.empty(len(c),dtype=object)
finalc[:]=c
np.save("file",c)