AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Einfache Version von Numpy in Delphi nachbauen

Ein Thema von bernhard_LA · begonnen am 3. Jan 2024 · letzter Beitrag vom 3. Jan 2024
Antwort Antwort
Seite 1 von 2  1 2      
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#1

Einfache Version von Numpy in Delphi nachbauen

  Alt 3. Jan 2024, 08:53
Ich will Python-Code unter Delphi nachbauen und dann in einem weiteren Schritt mit meinen eigenen Ideen , Bibliotheken auf meine eigentliche Aufgabenstellung anpassen.
Ich brauche im ersten Schritt um im Programm-Ablauf identisch zum Original-Code zu bleiben, eine "Mini"-Numpy Emulierung. Weiter unten habe ich meine "Spielversion" - eingefügt.

Meine Frage : was wäre die beste Lösung um alle ArrayTypen (Integer, Float, Bool) zu unterstützen ? Wie würde man am elegantesten 2D und 3D Array Typen untertützen , dh. eine Interpretation meines 1D-Arrays in 2D oder 3D
.


Delphi-Quellcode:
var
  A: TNDArray;
  i, j: Integer;
  NumPy : TNumPy;
begin

  A := TNumPy.ToArray([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);

  // Save the 2D array as a CSV file
  TNumPy.Shape(4, 4); // Set the shape of the array

  TNumPy.Savetxt('c:\temp\output.csv', A ); // Save the array as a CSV file
end ;



Andere Ideen zu diesem Projekt, bin für alle Anmerkungen offen









Delphi-Quellcode:
unit Unit_NumPy;

interface

uses
  System.Classes, System.SysUtils, System.Generics.Collections, System.Math;

type
  T2DDoubleArray = array of array of Double;
  TNDArray = TArray<Double>;
  TNDArray2 = TArray<TNDArray> ;
  TByteArray = TArray<Byte>;
  TBoolArray = Tarray<Boolean>;
  TCardinalArray = TArray<Cardinal>;
  TIntegerArray = TArray<Integer>;


  TNumPy = class
  class var
    FWidth: Integer;
    FHeight: Integer;

  private


  public
    class function arange(const start, stop, step: Double): TNDArray; static;
    class function ToArray(const Values: array of Double): TNDArray; overload; static;
    class function ToArray(const Values: T2DDoubleArray): TArray<TNDArray>; overload; static;
    class function diff(const a: TNDArray): TNDArray; static;
    class function mean(const a: TNDArray): Double; static;
    class function sum(const a: TNDArray): Double; static;
    class function prod(const a: TNDArray): Double; static;
    class function ConvertByteArrayToNDArray(const a: TByteArray)
      : TNDArray; static;
    class function max(const a: TNDArray): Double; static;
    class function min(const a: TNDArray): Double; static;
    class function unique(const a: TNDArray): TNDArray; static;
    class function isnan(const a: TNDArray): TBoolArray; static;
    class function all(const a: TNDArray): Boolean;
    class procedure Shape(X, y: Integer);
    class procedure Savetxt(const fname: string; const X: TNDArray;
      const fmt: string = '%.18e'; const delimiter: string = ';';
      const newline: string = #10; const header: string = '';
      const footer: string = ''; const comments: string = '# ';
      const encoding: TEncoding = nil);

  end;

implementation

{ TNumPy }


class function TNumPy.min(const a: TNDArray): Double;
var
  i: Integer;
  n: Integer;
begin
  n := Length(a);

  if n = 0 then
    Exit(0);

  Result := a[0];

  for i := 1 to n - 1 do
    if a[i] < Result then
      Result := a[i];
end;



class function TNumPy.max(const a: TNDArray): Double;
var
  i: Integer;
  n: Integer;
begin
  n := Length(a);

  if n = 0 then
    Exit(0);

  Result := a[0];

  for i := 1 to n - 1 do
    if a[i] > Result then
      Result := a[i];
end;



class function TNumPy.ToArray(const Values: array of Double): TNDArray;
var
  i: Integer;
begin
  SetLength(Result, Length(Values));
  for i := 0 to High(Values) do
    Result[i] := Values[i];
end;


class function TNumPy.isnan(const a: TNDArray): TBoolArray;
var
  i: Integer;
  n: Integer;
begin
  n := Length(a);
  SetLength(Result, n);

  for i := 0 to n - 1 do
    Result[i] := System.Math.IsNan(a[i]);
end;

class function TNumPy.ToArray(const Values: T2DDoubleArray): TArray<TNDArray>;
var
  i, j: Integer;
begin
  SetLength(Result, Length(Values));
  for i := 0 to High(Values) do
  begin
    SetLength(Result[i], Length(Values[i]));
    for j := 0 to High(Values[i]) do
      Result[i][j] := Values[i][j];
  end;
end;

class function TNumPy.arange(const start, stop, step: Double): TNDArray;
var
  i: Integer;
  n: Integer;
begin
  n := Round((stop - start) / step);
  SetLength(Result, n);

  for i := 0 to n - 1 do
    Result[i] := start + i * step;
end;

class function TNumPy.ConvertByteArrayToNDArray(const a: TByteArray): TNDArray;
var
  i: Integer;
  n: Integer;
begin
  n := Length(a);
  SetLength(Result, n);

  for i := 0 to n - 1 do
    Result[i] := a[i];
end;

class function TNumPy.diff(const a: TNDArray): TNDArray;
var
  i: Integer;
  n: Integer;
begin
  n := Length(a) - 1;
  SetLength(Result, n);

  for i := 0 to n - 1 do
    Result[i] := a[i + 1] - a[i];
end;

class function TNumPy.mean(const a: TNDArray): Double;
var
  i: Integer;
  n: Integer;
begin
  n := Length(a);

  if n = 0 then
    Exit(0);

  Result := 0;

  for i := 0 to n - 1 do
    Result := Result + a[i];

  Result := Result / n;
end;

class function TNumPy.prod(const a: TNDArray): Double;
var
  i: Integer;
  n: Integer;
begin
  n := Length(a);
  Result := 1;

  for i := 0 to n - 1 do
    Result := Result * a[i];
end;

class procedure TNumPy.Shape(X, y: Integer);
begin
  FWidth := X;
  FHeight := y;
end;

class function TNumPy.unique(const a: TNDArray): TNDArray;
var
  i, j: Integer;
  temp: Double;
  uniqueArr: TList<Double>;
begin
  uniqueArr := TList<Double>.Create;

  try
    for i := 0 to Length(a) - 1 do
    begin
      temp := a[i];
      if not uniqueArr.Contains(temp) then
        uniqueArr.Add(temp);
    end;

    SetLength(Result, uniqueArr.Count);

    for j := 0 to uniqueArr.Count - 1 do
      Result[j] := uniqueArr[j];

  finally
    uniqueArr.Free;
  end;
end;

class function TNumPy.sum(const a: TNDArray): Double;
var
  i: Integer;
  n: Integer;
begin
  n := Length(a);
  Result := 0;

  for i := 0 to n - 1 do
    Result := Result + a[i];
end;

class procedure TNumPy.Savetxt(const fname: string; const X: TNDArray;
  const fmt: string = '%.18e'; const delimiter: string = ';';
  const newline: string = #10; const header: string = '';
  const footer: string = ''; const comments: string = '# ';
  const encoding: TEncoding = nil);
var
  sl: TStringList;
  i, j: Integer;
  row: string;
  width, height: Integer;
begin
  width := FWidth;
  Height := FHeight;

  if (width = 0) or (height = 0) then
    raise Exception.Create('Invalid array shape');

  sl := TStringList.Create;

  try
    if header <> 'then
      sl.Add(comments + header);

    for i := 0 to height - 1 do
    begin
      row := Format(fmt, [X[i * width]]);
      for j := 1 to width - 1 do
        row := row + delimiter + Format(fmt, [X[i * width + j]]);
      sl.Add(row);
    end;

    if footer <> 'then
      sl.Add(comments + footer);

    sl.SaveToFile(fname, encoding);

  finally
    sl.Free;
  end;
end;


class function TNumPy.all(const a: TNDArray): Boolean;
var
  i: Integer;
begin
  for i := 0 to Length(a) - 1 do
  begin
    if not (a[i] <> 0) then
    begin
      Result := False;
      Exit;
    end;
  end;
  Result := True;
end;

end.

Geändert von bernhard_LA ( 3. Jan 2024 um 08:55 Uhr)
  Mit Zitat antworten Zitat
0KommaNix

Registriert seit: 20. Jul 2006
Ort: Halle/Saale
23 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Einfache Version von Numpy in Delphi nachbauen

  Alt 3. Jan 2024, 18:44
Hallo Bernhard,
ich glaube da machst du es dir unnötig schwer. Kennst du Python4Delphi? Damit kannst du die Python.dll direkt in Delphi einbinden. Statt ein Python Interpreter in Delphi nachzubauen, würde ich das vorhandene Skript nehmen und um eine Ausgabe der Ergebnisse ergänzen. Wenn ich mich recht entsinne, wird eine bidirektionale Einbindung unterstützt - also Delphi Variablen in Python benutzen und Python Variablen in Delphi. Das Python4Delphi enthält Demo-Projekte, die man als Ausgangspunkt nehmen kann.
Bernd
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#3

AW: Einfache Version von Numpy in Delphi nachbauen

  Alt 3. Jan 2024, 18:54
Meinst Du etwa das:
https://github.com/pyscripter/python4delphi
?
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Einfache Version von Numpy in Delphi nachbauen

  Alt 3. Jan 2024, 19:00
Daran habe ich auch gedacht, aber das ist ja eher für die Nutzung von Python Skripten in Delphi gedacht.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
0KommaNix

Registriert seit: 20. Jul 2006
Ort: Halle/Saale
23 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Einfache Version von Numpy in Delphi nachbauen

  Alt 3. Jan 2024, 19:17
Nein, ich meintehttps://github.com/Embarcadero/python4delphi
Pyscripter benutzt Python4Delphi. Sicher auch interessant.

Daran habe ich auch gedacht, aber das ist ja eher für die Nutzung von Python Skripten in Delphi gedacht.
Ja das ist so. Zwar nicht dass was Bernhard will, aber wie ich bereits schrieb, halte ich diesem Weg für viel erfolgversprechender. Was ist zum Beispiel, wenn es nicht bei Numpy bleibt? Dann sitzt man mit einer eigenen Implementierung schnell auf einen toten Ast.
Bernd
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#6

AW: Einfache Version von Numpy in Delphi nachbauen

  Alt 3. Jan 2024, 19:43
Ich bin etwas verwirrt, denn die beiden Inhalte

1):
https://github.com/pyscripter/python.../master/Source
2):
https://github.com/Embarcadero/pytho.../master/Source

scheinen ziemlich gleich zu sein...

[Edit]
... und der Link von 0KommaNix in Post #2 Erste Schritte mit Python4Delphi https://blogs.embarcadero.com/de/get...python4delphi/ verweist auf https://github.com/pyscripter/python4delphi
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)

Geändert von Andreas13 ( 3. Jan 2024 um 19:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Einfache Version von Numpy in Delphi nachbauen

  Alt 3. Jan 2024, 20:00
Ist auch in etwa das Gleiche.

Von pyscripter das Original
und das Andere ist die Version/Kopie, welche du im Delphi über GetIt installieren kannst (in etwas neueren Delphis).
https://getitnow.embarcadero.com/del...thon-exporter/ [edit] falscher Link ... irgendwie fehlt Vieles im GetItNow [/edit]
https://www.youtube.com/watch?v=D5ieaSkMFsU&t=64s
$2B or not $2B

Geändert von himitsu ( 3. Jan 2024 um 21:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Einfache Version von Numpy in Delphi nachbauen

  Alt 3. Jan 2024, 20:03
Beim GetIt weiß ich es nicht, aber beim Ersten brauchst'e natürlich noch das Python selbst. (Letztes vermutlich auch)

Entweder installiert (für ein 32-Bit-Programm natürlich die 32-Bit-Version)
oder als Embedded-Version, also nur die ZIP runterladen und entpacken (kann man ins Verzeichnis oder besser in ein Unterverzeichnis zu seinem Programm legen)


Alternativ kann man natürlich auch statt der DLL die EXE aufrufen (ShellExecute/CreateProcess, also das Script als Datei oder Stream rein und dann den Ausgabe-Stream irgendwie abfangen)


Über den WindowsScriptingHost (WSH) geht es aktuell nicht, da sich keine Python-Installation mehr bei Windows registiert.
$2B or not $2B

Geändert von himitsu ( 3. Jan 2024 um 20:12 Uhr)
  Mit Zitat antworten Zitat
0KommaNix

Registriert seit: 20. Jul 2006
Ort: Halle/Saale
23 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Einfache Version von Numpy in Delphi nachbauen

  Alt 3. Jan 2024, 20:08
... und der Link von 0KommaNix in Post #2 Erste Schritte mit Python4Delphi https://blogs.embarcadero.com/de/get...python4delphi/ verweist auf https://github.com/pyscripter/python4delphi
Python4delphi und Pyscripter sind vom selben Autor: Kiriakos Vlahos. Ich würde beide Gits Clonen und dann lokal prüfen, was aktueller ist. Python4Delphi sollte aber unabhängig von Pyscripter funktionieren. Ich vermute der Autor pflegt beides parallel.
Bernd
  Mit Zitat antworten Zitat
0KommaNix

Registriert seit: 20. Jul 2006
Ort: Halle/Saale
23 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Einfache Version von Numpy in Delphi nachbauen

  Alt 3. Jan 2024, 20:17
Entweder installiert (für ein 32-Bit-Programm natürlich die 32-Bit-Version)
oder als Embedded-Version (kann man ins Verzeichnis oder besser in ein Unterverzeichnis zu seinem Programm legen)
Ich empfehle dringendst ein virtuelles Environment zu benutzen: venv. Dann hat man alles lokal im Projektverzeichnis. Die Verwendung eines global installierten Python führt sehr schnell ins absolute Chaos.
Bernd

Geändert von 0KommaNix ( 3. Jan 2024 um 20:17 Uhr) Grund: typo
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz