add frombuffer function to create ndarray object

This commit is contained in:
wyq 2024-08-13 17:23:59 +08:00
parent e4004a2a4a
commit 88f4010d86
7 changed files with 129 additions and 15 deletions

View File

@ -67,7 +67,7 @@ import java.util.zip.ZipInputStream;
public static String getVersion() { public static String getVersion() {
String version = GlobalUtil.class.getPackage().getImplementationVersion(); String version = GlobalUtil.class.getPackage().getImplementationVersion();
if (version == null || version.equals("")) { if (version == null || version.equals("")) {
version = "3.9.1"; version = "3.9.2";
} }
return version; return version;
} }

View File

@ -1,32 +1,32 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<MeteoInfo File="milconfig.xml" Type="configurefile"> <MeteoInfo File="milconfig.xml" Type="configurefile">
<Path OpenPath="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\surf"> <Path OpenPath="D:\Working\MIScript\Jython\mis\io\radar">
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo\calc"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\map"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\map"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\map\projection"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\map\projection"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io\radar"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo\interpolation"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo\interpolation"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\slice"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math\interpolate"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math\interpolate"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\surf"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\surf"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\slice"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io\radar\cinrad"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io\radar"/>
</Path> </Path>
<File> <File>
<OpenedFiles> <OpenedFiles>
<OpenedFile File="D:\Working\MIScript\Jython\mis\meteo\interpolation\cross_section_1.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\slice\slice_2d.py"/> <OpenedFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\slice\slice_2d.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\common_math\interpolate\griddata_kriging_lcc.py"/> <OpenedFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\slice\plot_cuace_3d_slice.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\io\radar\cinrad\test_read_radar_mosic.py"/>
</OpenedFiles> </OpenedFiles>
<RecentFiles> <RecentFiles>
<RecentFile File="D:\Working\MIScript\Jython\mis\meteo\interpolation\cross_section_1.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\slice\slice_2d.py"/> <RecentFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\slice\slice_2d.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\common_math\interpolate\griddata_kriging_lcc.py"/> <RecentFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\slice\plot_cuace_3d_slice.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\io\radar\cinrad\test_read_radar_mosic.py"/>
</RecentFiles> </RecentFiles>
</File> </File>
<Font> <Font>

View File

@ -33,9 +33,10 @@ class DataType(object):
Data type Data type
:param name: (*string*) Data type name :param name: (*string*) Data type name
:param byteorder: (*str*) Byte order. Default to '<'.
""" """
def __init__(self, name): def __init__(self, name, byteorder='<'):
if name is int: if name is int:
name = 'int' name = 'int'
elif name is float: elif name is float:
@ -47,6 +48,7 @@ class DataType(object):
self._dtype = _dtype_dict[name] self._dtype = _dtype_dict[name]
else: else:
self._dtype = JDataType.OBJECT self._dtype = JDataType.OBJECT
self._byteorder=byteorder
@property @property
def itemsize(self): def itemsize(self):
@ -62,7 +64,15 @@ class DataType(object):
A character indicating the byte-order of this data-type object. A character indicating the byte-order of this data-type object.
:return: (*str*) Byte order. :return: (*str*) Byte order.
""" """
return '>' return self._byteorder
@byteorder.setter
def byteorder(self, val):
"""
Set byte order.
:param val: (*str*) Byte order ['<' | '>'].
"""
self._byteorder = val
@property @property
def num(self): def num(self):

View File

@ -9,7 +9,7 @@ import _dtype
from ._ndarray import NDArray from ._ndarray import NDArray
__all__ = [ __all__ = [
'fromfile' 'fromfile','frombuffer'
] ]
def fromfile(file, dtype=_dtype.float, count=-1, sep='', offset=0): def fromfile(file, dtype=_dtype.float, count=-1, sep='', offset=0):
@ -31,4 +31,22 @@ def fromfile(file, dtype=_dtype.float, count=-1, sep='', offset=0):
r = ArrayUtil.readASCIIFile(file, dtype._dtype, count, sep) r = ArrayUtil.readASCIIFile(file, dtype._dtype, count, sep)
else: else:
r = ArrayUtil.readBinFile(file, dtype._dtype, count, offset) r = ArrayUtil.readBinFile(file, dtype._dtype, count, offset)
return NDArray(r) return NDArray(r)
def frombuffer(buffer, dtype=_dtype.float, count=-1, offset=0):
"""
Interpret a buffer as a 1-dimensional array.
:param buffer: (*buffer-like*) An object that exposes the buffer interface.
:param dtype: (*dtype*) Data type. Defaults to float.
:param count: (*int*) Number of items to read. -1 means all items.
:param offset: (*int*) The offset (in bytes) from the files current position. Defaults to 0.
:return: (*array*) The array read from the buffer.
"""
if not isinstance(dtype, _dtype.DataType):
dtype = _dtype.DataType(dtype)
byteorder = 'little_endian' if dtype.byteorder == '<' else 'big_endian'
r = ArrayUtil.fromBuffer(buffer, dtype._dtype, count, offset, byteorder)
return NDArray(r)

View File

@ -623,6 +623,92 @@ public class ArrayUtil {
return r; return r;
} }
/**
* Read array from a buffer byte array
*
* @param buffer Buffer data
* @param dataType Data type
* @param count Number of items to read. -1 means all items (i.e., the complete file)
* @param offset Offset bytes
* @return Result array
*/
public static Array fromBuffer(byte[] buffer, DataType dataType, int count, int offset) {
return fromBuffer(buffer, dataType, count, offset, "little_endian");
}
/**
* Read array from a buffer byte array
*
* @param buffer Buffer data
* @param dataType Data type
* @param count Number of items to read. -1 means all items (i.e., the complete file)
* @param offset Offset bytes
* @param byteOrder Byte order
* @return Result array
*/
public static Array fromBuffer(byte[] buffer, DataType dataType, int count, int offset,
String byteOrder) {
ByteOrder bOrder = ByteOrder.LITTLE_ENDIAN;
if (byteOrder.equalsIgnoreCase("big_endian")) {
bOrder = ByteOrder.BIG_ENDIAN;
}
if (count < 0) {
long size = buffer.length;
count = (int)((size - offset) / dataType.getSize());
}
Array r = Array.factory(dataType, new int[]{count});
IndexIterator iter = r.getIndexIterator();
int idx = offset;
byte[] bytes;
byte[] db;
int start = 0;
int n = (int) r.getSize() * dataType.getSize();
bytes = Arrays.copyOfRange(buffer, idx, idx + n);
switch (dataType) {
case BYTE:
for (int i = 0; i < r.getSize(); i++) {
r.setByte(i, bytes[i]);
}
break;
case SHORT:
db = new byte[2];
while (iter.hasNext()) {
System.arraycopy(bytes, start, db, 0, 2);
iter.setShortNext(DataTypeUtil.bytes2Short(db, bOrder));
start += 2;
}
break;
case INT:
db = new byte[4];
while (iter.hasNext()) {
System.arraycopy(bytes, start, db, 0, 4);
iter.setIntNext(DataTypeUtil.bytes2Int(db, bOrder));
start += 4;
}
break;
case FLOAT:
db = new byte[4];
while (iter.hasNext()) {
System.arraycopy(bytes, start, db, 0, 4);
iter.setFloatNext(DataTypeUtil.bytes2Float(db, bOrder));
start += 4;
}
break;
case DOUBLE:
db = new byte[8];
while (iter.hasNext()) {
System.arraycopy(bytes, start, db, 0, 8);
iter.setDoubleNext(DataTypeUtil.bytes2Double(db, bOrder));
start += 8;
}
break;
}
return r;
}
// </editor-fold> // </editor-fold>
// <editor-fold desc="Create"> // <editor-fold desc="Create">
/** /**

View File

@ -35,7 +35,7 @@
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version> <java.version>1.8</java.version>
<revision>3.9.1</revision> <revision>3.9.2</revision>
<maven.compiler.source>8</maven.compiler.source> <maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target> <maven.compiler.target>8</maven.compiler.target>
<maven.compiler.release>8</maven.compiler.release> <maven.compiler.release>8</maven.compiler.release>