numpy.array(R) * -1
является самым простым
, если вам нужно сделать это вручную
[[val*-1 for val in row] for row in R]
Ваш код неоправданно сложен, даже для более старых версий Delphi. Почему, в конце концов, выборка строковой версии потока заставляет перераспределять память потока?
function MemoryStreamToString(M: TMemoryStream): string;
begin
SetString(Result, PChar(M.Memory), M.Size div SizeOf(Char));
end;
Это работает во всех версиях Delphi, а не только в Delphi 2009. Это работает, когда поток пуст без какого-либо особого случая. SetString
- недооцененная функция.
Если содержимое вашего потока не меняется на Unicode с вашим переключением на Delphi 2009, тогда вы должны использовать эту функцию вместо этого:
function MemoryStreamToString(M: TMemoryStream): AnsiString;
begin
SetString(Result, PAnsiChar(M.Memory), M.Size);
end;
Это эквивалентно Ваш оригинальный код, но пропускает особые случаи.
«Чистым» может быть:
function StreamToString(aStream: TStream): string;
var
SS: TStringStream;
begin
if aStream <> nil then
begin
SS := TStringStream.Create('');
try
SS.CopyFrom(aStream, 0); // No need to position at 0 nor provide size
Result := SS.DataString;
finally
SS.Free;
end;
end else
begin
Result := '';
end;
end;
Или, возможно, вы можете реорганизовать свой код для непосредственного использования TStringStream? Вы можете использовать его вместо TMemoryStream (они имеют одинаковый интерфейс), и вы можете «преобразовать» его в строку, просто вызвав myString: = myStringStream.DataString;
Я еще не обновился, но я понимаю:
NewCapacity := (M.Size + 1) * SizeOf(Char);