update the function of set array section value

This commit is contained in:
wyq 2021-03-31 23:09:10 +08:00
parent 9d98214394
commit e609a29d0a
7 changed files with 365 additions and 11 deletions

View File

@ -1,8 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<MeteoInfo File="milconfig.xml" Type="configurefile">
<Path OpenPath="D:\Working\MIScript\Jython\mis\toolbox\miml\deep_learning\classification">
<Path OpenPath="D:\Working\MIScript\Jython\mis\array">
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\array"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math\interpolate"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d"/>
@ -16,17 +15,18 @@
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\toolbox\miml"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\toolbox\miml\deep_learning"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\toolbox\miml\deep_learning\classification"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\array"/>
</Path>
<File>
<OpenedFiles>
<OpenedFile File="D:\Working\MIScript\cuace\script\plot_pm25_3d_particles_relief.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\contourf_1.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\toolbox\miml\deep_learning\classification\moon.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\array\set_item.py"/>
</OpenedFiles>
<RecentFiles>
<RecentFile File="D:\Working\MIScript\cuace\script\plot_pm25_3d_particles_relief.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\contourf_1.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\toolbox\miml\deep_learning\classification\moon.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\array\set_item.py"/>
</RecentFiles>
</File>
<Font>
@ -34,5 +34,5 @@
</Font>
<LookFeel DockWindowDecorated="true" LafDecorated="true" Name="FlatDarkLaf"/>
<Figure DoubleBuffering="true"/>
<Startup MainFormLocation="-3,4" MainFormSize="1308,744"/>
<Startup MainFormLocation="-7,-7" MainFormSize="1293,693"/>
</MeteoInfo>

View File

@ -239,12 +239,10 @@ class NDArray(object):
return None
if not isinstance(indices, tuple):
inds = []
inds.append(indices)
indices = inds
indices = [indices]
if len(indices) < self.ndim:
for i in range(self.ndim - len(indices)):
for _ in range(self.ndim - len(indices)):
indices.append(slice(None))
if self.ndim == 0:

View File

@ -8,5 +8,5 @@
<ScriptLanguage Language="Jython"/>
<LookFeel LafDecorated="true" Name="FlatLightLaf"/>
<Figure DoubleBuffering="true"/>
<Startup MainFormLocation="-4,6" MainFormSize="1293,693" ShowMeteoDataDlg="true"/>
<Startup MainFormLocation="-7,-7" MainFormSize="1293,693" ShowMeteoDataDlg="true"/>
</MeteoInfo>

View File

@ -0,0 +1,310 @@
package org.meteoinfo.ndarray;
import java.time.LocalDateTime;
import java.util.List;
public class MixIterator implements IndexIterator {
private int count = 0;
private int currElement = 0;
private int size = 0;
private int rank = 1;
private List<Object> ranges;
private Array array;
private Index rangeIndex;
private IndexIterator rangeIndexIter;
/**
* Constructor
* @param array The array
* @param ranges The range list - mixed with int list and Range
*/
public MixIterator(Array array, List<Object> ranges) {
this.array = array;
this.ranges = ranges;
this.rank = ranges.size();
int i = 0;
int[] shape = new int[this.rank];
for (Object range : this.ranges) {
if (range instanceof Range) {
shape[i] = ((Range) range).length();
} else {
shape[i] = ((List) range).size();
}
i += 1;
}
Array tempArray = Array.factory(DataType.INT, shape);
this.size = (int) tempArray.getSize();
this.rangeIndex = tempArray.getIndex();
this.rangeIndexIter = tempArray.getIndexIterator();
}
@Override
public boolean hasNext() {
return this.rangeIndexIter.hasNext();
}
@Override
public double getDoubleNext() {
return 0;
}
@Override
public void setDoubleNext(double val) {
}
@Override
public double getDoubleCurrent() {
return 0;
}
@Override
public void setDoubleCurrent(double val) {
}
@Override
public float getFloatNext() {
return 0;
}
@Override
public void setFloatNext(float val) {
}
@Override
public float getFloatCurrent() {
return 0;
}
@Override
public void setFloatCurrent(float val) {
}
@Override
public long getLongNext() {
return 0;
}
@Override
public void setLongNext(long val) {
}
@Override
public long getLongCurrent() {
return 0;
}
@Override
public void setLongCurrent(long val) {
}
@Override
public int getIntNext() {
return 0;
}
@Override
public void setIntNext(int val) {
}
@Override
public int getIntCurrent() {
return 0;
}
@Override
public void setIntCurrent(int val) {
}
@Override
public short getShortNext() {
return 0;
}
@Override
public void setShortNext(short val) {
}
@Override
public short getShortCurrent() {
return 0;
}
@Override
public void setShortCurrent(short val) {
}
@Override
public byte getByteNext() {
return 0;
}
@Override
public void setByteNext(byte val) {
}
@Override
public byte getByteCurrent() {
return 0;
}
@Override
public void setByteCurrent(byte val) {
}
@Override
public char getCharNext() {
return 0;
}
@Override
public void setCharNext(char val) {
}
@Override
public char getCharCurrent() {
return 0;
}
@Override
public void setCharCurrent(char val) {
}
@Override
public String getStringNext() {
return null;
}
@Override
public void setStringNext(String val) {
}
@Override
public String getStringCurrent() {
return null;
}
@Override
public void setStringCurrent(String val) {
}
@Override
public boolean getBooleanNext() {
return false;
}
@Override
public void setBooleanNext(boolean val) {
}
@Override
public boolean getBooleanCurrent() {
return false;
}
@Override
public void setBooleanCurrent(boolean val) {
}
@Override
public Complex getComplexNext() {
return null;
}
@Override
public void setComplexNext(Complex val) {
}
@Override
public Complex getComplexCurrent() {
return null;
}
@Override
public void setComplexCurrent(Complex val) {
}
@Override
public void setDateCurrent(LocalDateTime val) {
}
@Override
public LocalDateTime getDateNext() {
return null;
}
@Override
public void setDateNext(LocalDateTime val) {
}
@Override
public LocalDateTime getDateCurrent() {
return null;
}
@Override
public Object getObjectNext() {
return null;
}
@Override
public void setObjectNext(Object val) {
}
@Override
public Object getObjectCurrent() {
return null;
}
@Override
public void setObjectCurrent(Object val) {
}
@Override
public Object next() {
return this.rangeIndexIter.next();
}
@Override
public int[] getCurrentCounter() {
int[] currentCounter = new int[this.rank];
int[] rangeCounter = this.rangeIndexIter.getCurrentCounter();
int i = 0;
int c;
for (Object range : this.ranges) {
if (range instanceof Range) {
c = ((Range)range).elementNC(rangeCounter[i]);
} else {
c = ((List<Integer>)range).get(rangeCounter[i]);
}
currentCounter[i] = c;
i += 1;
}
return currentCounter;
}
}

View File

@ -438,7 +438,7 @@ if(false) {// Original version
* @param i index of the element
* @return the i-th element of a range, no check
*/
private int elementNC(int i) {
public int elementNC(int i) {
return first + i * stride;
}

View File

@ -4739,6 +4739,28 @@ public class ArrayMath {
* @return Result array
*/
public static Array setSection_Mix(Array a, List<Object> ranges, Number v) {
MixIterator mixIterator = new MixIterator(a, ranges);
Index index = a.getIndex();
int[] current;
while (mixIterator.hasNext()) {
mixIterator.next();
current = mixIterator.getCurrentCounter();
index.set(current);
a.setObject(index, v);
}
return a;
}
/**
* Set section
*
* @param a Array a
* @param ranges Ranges
* @param v Number value
* @return Result array
*/
public static Array setSection_Mix_Bak(Array a, List<Object> ranges, Number v) {
Array r = Array.factory(a.getDataType(), a.getShape());
int n = a.getRank();
IndexIterator iter = r.getIndexIterator();
@ -4783,6 +4805,30 @@ public class ArrayMath {
* @return Result array
*/
public static Array setSection_Mix(Array a, List<Object> ranges, Array v) {
MixIterator mixIterator = new MixIterator(a, ranges);
Index index = a.getIndex();
Index vIndex = v.getIndex();
int[] current;
while (mixIterator.hasNext()) {
mixIterator.next();
current = mixIterator.getCurrentCounter();
index.set(current);
a.setObject(index, v.getObject(vIndex));
vIndex.incr();
}
return a;
}
/**
* Set section
*
* @param a Array a
* @param ranges Ranges
* @param v Array value
* @return Result array
*/
public static Array setSection_Mix_Bak(Array a, List<Object> ranges, Array v) {
Array r = Array.factory(a.getDataType(), a.getShape());
int n = a.getRank();
IndexIterator iter = r.getIndexIterator();