此頁(yè)面處理常見應(yīng)用程序,有關(guān) I/O 例程的完整集合,請(qǐng)參閱輸入和輸出
使用 numpy.loadtxt
使用 numpy.getfromtxt
numpy.getfromtxt要么:
usemask = True
)filling_values
(默認(rèn)np.nan
為浮點(diǎn)數(shù),-1 為整數(shù))。>>> print(open("csv.txt").read())
1, 2, 3
4,, 6
7, 8, 9
掩碼陣列輸出
>>> np.genfromtxt("csv.txt", delimiter=",", usemask=True)
masked_array(
data=[[1.0, 2.0, 3.0],
[4.0, --, 6.0],
[7.0, 8.0, 9.0]],
mask=[[False, False, False],
[False, True, False],
[False, False, False]],
fill_value=1e+20)
數(shù)組輸出
>>> np.genfromtxt("csv.txt", delimiter=",")
array([[ 1., 2., 3.],
[ 4., nan, 6.],
[ 7., 8., 9.]])
數(shù)組輸出,指定填充值
>>> np.genfromtxt("csv.txt", delimiter=",", dtype=np.int8, filling_values=99)
array([[ 1, 2, 3],
[ 4, 99, 6],
[ 7, 8, 9]], dtype=int8)
numpy.genfromtxt
?還可以解析具有缺失值的以空格分隔的數(shù)據(jù)文件,如果
每個(gè)字段都有一個(gè)固定的寬度:使用寬度作為分隔符參數(shù)。
## File with width=4. The data does not have to be justified (for example,
## the 2 in row 1), the last column can be less than width (for example, the 6
## in row 2), and no delimiting character is required (for instance 8888 and 9
## in row 3)
>>> f = open("fixedwidth.txt").read() # doctest: +SKIP
>>> print(f) # doctest: +SKIP
1 2 3
44 6
7 88889
## Showing spaces as ^
>>> print(f.replace(" ","^")) # doctest: +SKIP
1^^^2^^^^^^3
44^^^^^^6
7^^^88889
>>> np.genfromtxt("fixedwidth.txt", delimiter=4) # doctest: +SKIP
array([[1.000e+00, 2.000e+00, 3.000e+00],
[4.400e+01, nan, 6.000e+00],
[7.000e+00, 8.888e+03, 9.000e+00]])
特殊值(例如“x”)表示缺少字段:將其用作?missing_values參數(shù)。
>>> print(open("nan.txt").read())
1 2 3
44 x 6
7 8888 9
>>> np.genfromtxt("nan.txt", missing_values="x")
array([[1.000e+00, 2.000e+00, 3.000e+00],
[4.400e+01, nan, 6.000e+00],
[7.000e+00, 8.888e+03, 9.000e+00]])
您想跳過(guò)缺少值的行:設(shè)置?invalid_raise=False。
>>> print(open("skip.txt").read())
1 2 3
44 6
7 888 9
>>> np.genfromtxt("skip.txt", invalid_raise=False)
__main__:1: ConversionWarning: Some errors were detected !
Line #2 (got 2 columns instead of 3)
array([[ 1., 2., 3.],
[ 7., 888., 9.]])
分隔符空白字符不同于表示丟失數(shù)據(jù)的空白字符。例如,如果列由 分隔\t
,那么如果缺失數(shù)據(jù)由一個(gè)或多個(gè)空格組成,則將被識(shí)別。
>>> f = open("tabs.txt").read()
>>> print(f)
1 2 3
44 6
7 888 9
## Tabs vs. spaces
>>> print(f.replace("\t","^"))
1^2^3
44^ ^6
7^888^9
>>> np.genfromtxt("tabs.txt", delimiter="\t", missing_values=" +")
array([[ 1., 2., 3.],
[ 44., nan, 6.],
[ 7., 888., 9.]])
選擇:
numpy.load
.?它可以讀取任何的生成的文件?numpy.save
,numpy.savez
或numpy.savez_compressed
。numpy.lib.format.open_memmap
。使用?numpy.save
, 或 來(lái)存儲(chǔ)多個(gè)數(shù)組numpy.savez
?或numpy.savez_compressed
。
為了安全性和可移植性,allow_pickle=False
除非 dtype 包含需要酸洗的 Python 對(duì)象,否則設(shè)置?。
掩碼數(shù)組,其他任意數(shù)組子類也不能。can't?currently?be?saved
numpy.save
并numpy.savez
創(chuàng)建二進(jìn)制文件。要編寫人類可讀的文件,請(qǐng)使用numpy.savetxt
.?該數(shù)組只能是一維或二維的,并且沒有用于多個(gè)文件的 savetxtz
。
請(qǐng)參閱寫入或讀取大型數(shù)組。
使用結(jié)構(gòu)化數(shù)組
例子:
該.wav
文件頭是前面的44字節(jié)塊data_size
的實(shí)際聲音數(shù)據(jù)的字節(jié)數(shù):
chunk_id "RIFF"
chunk_size 4-byte unsigned little-endian integer
format "WAVE"
fmt_id "fmt "
fmt_size 4-byte unsigned little-endian integer
audio_fmt 2-byte unsigned little-endian integer
num_channels 2-byte unsigned little-endian integer
sample_rate 4-byte unsigned little-endian integer
byte_rate 4-byte unsigned little-endian integer
block_align 2-byte unsigned little-endian integer
bits_per_sample 2-byte unsigned little-endian integer
data_id "data"
data_size 4-byte unsigned little-endian integer
.wav
作為 NumPy 結(jié)構(gòu)化 dtype的文件頭:
wav_header_dtype = np.dtype([
("chunk_id", (bytes, 4)), # flexible-sized scalar type, item size 4
("chunk_size", "<u4"), # little-endian unsigned 32-bit integer
("format", "S4"), # 4-byte string, alternate spelling of (bytes, 4)
("fmt_id", "S4"),
("fmt_size", "<u4"),
("audio_fmt", "<u2"), #
("num_channels", "<u2"), # .. more of the same ...
("sample_rate", "<u4"), #
("byte_rate", "<u4"),
("block_align", "<u2"),
("bits_per_sample", "<u2"),
("data_id", "S4"),
("data_size", "<u4"),
#
# the sound data itself cannot be represented here:
# it does not have a fixed size
])
header = np.fromfile(f, dtype=wave_header_dtype, count=1)[0]
這個(gè).wav
例子是為了說(shuō)明;要.wav
在現(xiàn)實(shí)生活中讀取文件,請(qǐng)使用 Python 的內(nèi)置模塊wave
。
太大而無(wú)法放入內(nèi)存的數(shù)組可以像使用內(nèi)存映射的普通內(nèi)存中數(shù)組一樣處理。
numpy.ndarray.tofile
或?numpy.ndarray.tobytes
可以讀取numpy.memmap
:
array = numpy.memmap("mydata/myarray.arr", mode="r", dtype=np.int16, shape=(1024, 1024))
numpy.save
(即,使用numpy的格式)可以使用讀取numpy.load
與所述mmap_mode
關(guān)鍵字參數(shù):
large_array[some_slice] = np.load("path/to/small_array", mmap_mode="r")
內(nèi)存映射缺乏數(shù)據(jù)分塊和壓縮等功能;可與 NumPy 一起使用的更多功能齊全的格式和庫(kù)包括:
scipy.io.netcdf_file
.有關(guān) memmap、Zarr 和 HDF5 之間的權(quán)衡,請(qǐng)參閱?pythonspeed.com。
與其他工具交換數(shù)據(jù)的格式包括 HDF5、Zarr 和 NetCDF(請(qǐng)參閱寫入或讀取大型數(shù)組)。
NumPy 數(shù)組不能直接?JSON 序列化。
盡可能避免;泡菜對(duì)于錯(cuò)誤或惡意構(gòu)建的數(shù)據(jù)并不安全。
使用numpy.save
和numpy.load
。Set?allow_pickle=False
,除非數(shù)組 dtype 包含 Python 對(duì)象,在這種情況下需要酸洗。
見pandas.DataFrame.to_numpy
。
tofile
和保存/恢復(fù)fromfile
一般來(lái)說(shuō),更喜歡numpy.save
和numpy.load
。
numpy.ndarray.tofile
并numpy.fromfile
丟失有關(guān)字節(jié)順序和精度的信息,因此不適用于除臨時(shí)存儲(chǔ)之外的任何其他內(nèi)容。
更多建議: