1 package org.simantics.pythonlink;
\r
3 import java.util.Arrays;
\r
5 public class NDArray {
\r
9 public NDArray(double[] value) {
\r
11 dims = new int[] { value.length };
\r
14 public NDArray(int m, int n, double[] value) {
\r
15 if (n*m != value.length) throw new IllegalArgumentException("Invalid dimensions for data vector");
\r
18 dims = new int[] { m, n };
\r
21 public NDArray(int[] dims, double[] value) {
\r
22 int l = dims.length > 0 ? 1 : 0;
\r
23 for (int d : dims) l *= d;
\r
24 if (l != value.length) throw new IllegalArgumentException("Invalid dimensions for data vector");
\r
30 public int size() { return value.length; }
\r
31 public int[] dims() { return dims; }
\r
32 public double[] getValues() { return value; }
\r
34 public double getValue(int index) { return value[index]; }
\r
35 public double getValue(int i, int j) {
\r
36 if (dims.length != 2) throw new IllegalArgumentException("Invalid indices for array of dimension " + dims.length);
\r
38 return value[dims[1] * i + j];
\r
40 public double getValue(int... is) {
\r
41 if (dims.length != is.length) throw new IllegalArgumentException("Invalid indices for array of dimension " + dims.length);
\r
44 for (int k = 0; k < dims.length; k++) {
\r
45 index = dims[k] * index + is[k];
\r
47 return value[index];
\r
51 public boolean equals( Object o ) {
\r
52 return o instanceof NDArray &&
\r
53 Arrays.equals(dims, ((NDArray)o).dims) &&
\r
54 Arrays.equals(value, ((NDArray)o).value);
\r
58 public int hashCode() {
\r
59 return Arrays.hashCode(dims) + 11 * Arrays.hashCode(value);
\r
63 public String toString() {
\r
64 StringBuilder sb = new StringBuilder();
\r
65 sb.append("ndarray(");
\r
66 for (int i = 0; i < dims.length; i++) {
\r
67 if (i > 0) sb.append('x');
\r
72 if (dims.length > 0)
\r
73 buildString(sb, 0, 0);
\r
76 return sb.toString();
\r
79 private void buildString( StringBuilder sb, int d, int i ) {
\r
80 if (d == dims.length) {
\r
81 sb.append(value[i]);
\r
86 for (int j = 0; j < dims[d]; j++) {
\r
87 if (j > 0) sb.append(", ");
\r
88 buildString(sb, d+1, i + j);
\r