我试图保存一堆由数据来自使用savez的绝对文件路径键入的numpy数组。但是,当我使用load来检索该数据时,已从键中删除了前导斜杠。
>>> import numpy as np
>>> data = {}
>>> data['/foo/bar'] = np.array([1, 2, 3])
>>> data.keys()
['/foo/bar']
>>> np.savez('/tmp/test', **data)
>>> data2 = np.load('/tmp/test.npz')
>>> data2.keys()
['foo/bar']
numpy.savez是否期望这种行为?有解决方法还是我做错了什么?
答案 0 :(得分:1)
看起来剥离是由Python np.lib.npyio._savez
模块完成的,可能是在提取而不是写入:
https://docs.python.org/2/library/zipfile.html
注意如果成员文件名是绝对路径,则驱动器/ UNC共享点和前导(后退)斜杠将被剥离,例如:/// foo / bar在Unix上变为foo / bar,而C:\ foo \ bar在Windows上成为foo \ bar。并且会删除成员文件名中的所有“..”组件,例如:../../ foo../../ba..r变为foo ../ ba..r。在Windows上,非法字符(:,<,>,|,“,?和*)替换为下划线(_)。
写作在tmpfile
完成,首先是zipf.write(tmpfile, arcname=fname)
,然后是In [98]: np.savez('test.npz',**{'/foo/bar':arr})
In [99]: !unzip -lv test.npz
Archive: test.npz
Length Method Size Cmpr Date Time CRC-32 Name
-------- ------ ------- ---- ---------- ----- -------- ----
152 Stored 152 0% 2017-05-24 19:58 ef792502 foo/bar.npy
-------- ------- --- -------
152 152 0% 1 file
的归档。
# https://kojipkgs.fedoraproject.org//packages/cryptopp/5.6.3/8.fc27/data/logs/i686/build.log
# https://kojipkgs.fedoraproject.org//packages/cryptopp/5.6.3/8.fc27/data/logs/x86_64/build.log
if [[ ("$IS_X86" -ne "0") ]]; then
MARCH_OPT=(-m32 -march=i686)
else
MARCH_OPT=(-m64 -mtune=generic)
fi
FEDORA_FLAGS=(-DHAVE_CONFIG_H -I. -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2
-fexceptions -fstack-protector-strong --param=ssp-buffer-size=4
-specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 "${MARCH_OPT[@]}" -fasynchronous-unwind-tables)
"$MAKE" distclean > /dev/null 2>&1
CXX="g++" "$MAKE" "${MAKEARGS[@]}" CXXFLAGS="${FEDORA_FLAGS[@]}" cryptest.exe 2>&1