@graphty/layout
Version:
graph layout algorithms based on networkx
111 lines (98 loc) • 3.3 kB
text/typescript
/**
* NumPy-like array manipulation functions
* Maintains exact same functionality as original implementation
*/
export const np = {
zeros: function (shape: number | number[]): number | number[] | number[][] | any[] {
if (typeof shape === 'number') {
return Array(shape).fill(0);
}
if (shape.length === 1) {
return Array(shape[0]).fill(0);
}
return Array(shape[0]).fill(0).map(() => this.zeros(shape.slice(1)));
},
ones: function (shape: number | number[]): number | any[] {
if (typeof shape === 'number') {
return Array(shape).fill(1);
}
if (shape.length === 1) {
return Array(shape[0]).fill(1);
}
return Array(shape[0]).fill(1).map(() => this.ones(shape.slice(1)));
},
linspace: function (start: number, stop: number, num: number): number[] {
if (num === 1) {
return [start];
}
const step = (stop - start) / (num - 1);
return Array.from({ length: num }, (_, i) => start + i * step);
},
array: function (arr: any): any[] {
return Array.isArray(arr) ? [...arr] : [arr];
},
repeat: function (a: any, repeats: number): any[] {
const result: any[] = [];
for (let i = 0; i < repeats; i++) {
result.push(...np.array(a));
}
return result;
},
mean: function (arr: number[] | number[][], axis: number | null = null): number | number[] {
if (axis === null) {
const flatArr = Array.isArray(arr[0])
? (arr as number[][]).flat(Infinity) as number[]
: arr as number[];
const sum = flatArr.reduce((a, b) => a + b, 0);
return sum / flatArr.length;
}
if (axis === 0) {
const result: number[] = [];
const matrix = arr as number[][];
for (let i = 0; i < matrix[0].length; i++) {
let sum = 0;
for (let j = 0; j < matrix.length; j++) {
sum += matrix[j][i];
}
result.push(sum / matrix.length);
}
return result;
}
return (arr as number[][]).map(row => np.mean(row) as number);
},
add: function (a: number | number[], b: number | number[]): number | number[] {
if (!Array.isArray(a) && !Array.isArray(b)) {
return a + b;
}
if (!Array.isArray(a)) {
return (b as number[]).map(val => a + val);
}
if (!Array.isArray(b)) {
return (a as number[]).map(val => val + b);
}
return (a as number[]).map((val, i) => val + (b as number[])[i]);
},
subtract: function (a: number | number[], b: number | number[]): number | number[] {
if (!Array.isArray(a) && !Array.isArray(b)) {
return a - b;
}
if (!Array.isArray(a)) {
return (b as number[]).map(val => a - val);
}
if (!Array.isArray(b)) {
return (a as number[]).map(val => val - b);
}
return (a as number[]).map((val, i) => val - (b as number[])[i]);
},
max: function (arr: number | number[]): number {
if (!Array.isArray(arr)) return arr;
return Math.max(...(arr as number[]).flat(Infinity) as number[]);
},
min: function (arr: number | number[]): number {
if (!Array.isArray(arr)) return arr;
return Math.min(...(arr as number[]).flat(Infinity) as number[]);
},
norm: function (arr: number[]): number {
return Math.sqrt(arr.reduce((sum, val) => sum + val * val, 0));
}
};