【发布时间】:2018-12-15 13:36:27
【问题描述】:
我只是问这个问题,因为它两天前在我的桌面上工作,但当我试图在我的笔记本电脑上运行它时,它不起作用。
array = numpy.zeros((3,3,1))
numpy.savetxt("nxx", array, fmt='%s')
这给了我以下错误:
"预期的一维或二维数组,得到了 %dD 数组" % X.ndim) ValueError: 预期 1D 或 2D 数组,得到 3D 数组
【问题讨论】:
我只是问这个问题,因为它两天前在我的桌面上工作,但当我试图在我的笔记本电脑上运行它时,它不起作用。
array = numpy.zeros((3,3,1))
numpy.savetxt("nxx", array, fmt='%s')
这给了我以下错误:
"预期的一维或二维数组,得到了 %dD 数组" % X.ndim) ValueError: 预期 1D 或 2D 数组,得到 3D 数组
【问题讨论】:
正如the docs 解释的那样,savetxt 只能保存一维和二维数组。
你会如何希望保存它? savetxt 保存到 CSV 文件中:有由空格分隔的列和由换行符分隔的行,在文本编辑器中看起来不错并且是 2D 的。您如何将其扩展到 3D?
如果您想使用某种特定的格式,可能会有一个格式化程序(或者可能只是 reshape-ing 将数组缩小为 2D 的问题?),但您将拥有解释你想要什么。
如果您不关心在文本编辑器中编辑输出,为什么不将其保存为二进制格式,例如 numpy.save("nxx.npy", array)?它可以处理任何形状。
IIRC,NumPy 的旧版本通过将除一个维度之外的所有维度扁平化为一个维度来处理此问题。因此,要使用您的数据,您必须加载它然后对其进行重塑——只有在您从其他地方知道原始尺寸是什么的情况下,您才能做到这一点。你甚至不会意识到这个问题,直到你花了整整一周时间生成了几 TB 的文件,而这些文件你现在无法弄清楚如何使用。 (我猜这就是他们改变行为的原因——它被意外使用的次数比故意使用的次数更多,而且会带来令人讨厌的后果。)
无论如何,如果您想要这种行为,当然可以自己将数组重新构建为 2D,然后将其保存:
np.savetxt("nxx", array.reshape((3,-1)), fmt="%s")
或者,甚至更好:
np.savetxt("nxx", array.reshape((3,-1)), fmt="%s", header=str(array.shape))
【讨论】:
想给一些额外的代码 sn-ps 以提供更多的直觉。如下写一个二维数组就好了。
b = np.array([[1, 2], [3, 4]])
np.savetxt("racoon.txt", b)
写一个3D数组会导致你提到的错误。
c = np.array([[[1, 2], [3, 4]]])
np.savetxt("fox.txt", c)
3D 数组我们可以写一个二进制 NumPy 文件,正如 abarnert 提到的:
np.save("parrot.npy", c)
这个例子说明了文本文件不适合存储数组数据的原因之一。像Zarr 这样的二进制文件更好的原因有很多,包括能够无缝处理 3D+ 数组数据。
【讨论】: