Zrobiłem następujący kod:

Test.py

nc = 1; nb = 20; ni = 6; nc = 2; ia = 20; ib = 20; ic = 0

U1 = numpy.array((1,2,0,0,0,3))
U2 = numpy.array((2,2,1,0,0,1))
U3 = numpy.array((2,1,1,0,0,2))
U4 = numpy.array((2,1,0,1,0,2))
U5 = numpy.array((2,1,1,1,0,3))

for n in range(ni):
    a = nc*(nb*nc*ia+nc*ib+ic)+U1[n]
    a2 = ia + U1[n]
    b2 = ib + U3[n]
    c2 = ic + U4[n]
    b = nc*(nb*nc*a2+nc*b2+c2)+U2[n]
    A = str(numpy.array((a,b,U5[n])))
    print(A)
    with open("test.txt", 'w') as out:
        for o in A:
            out.write(o)

Test.txt daje mi następujące informacje:

[1683 1933    3]

Ale jeśli wydrukuję test.py przy użyciu print (A), otrzymam to:

[1681 1774    2]
[1682 1848    1]
[1680 1685    1]
[1680 1682    1]
[1680 1680    0]
[1683 1933    3]

Jak mogę zapisać cały wydruk w pliku test.txt? Zakładam, że zrobię coś takiego:

ol = []
ol.append(o))
0
Jolosin 2 kwiecień 2020, 15:17

3 odpowiedzi

Najlepsza odpowiedź

Najlepsze rozwiązanie - szybkie i wydajne

import numpy

nc = 1; nb = 20; ni = 6; nc = 2; ia = 20; ib = 20; ic = 0

U1 = numpy.array((1,2,0,0,0,3))
U2 = numpy.array((2,2,1,0,0,1))
U3 = numpy.array((2,1,1,0,0,2))
U4 = numpy.array((2,1,0,1,0,2))
U5 = numpy.array((2,1,1,1,0,3))

# No for loop here, we are using NumPy broadcasting features
a = nc*(nb*nc*ia+nc*ib+ic)+U1
a2 = ia + U1
b2 = ib + U3
c2 = ic + U4
b = nc * (nb * nc * a2 + nc * b2 + c2) + U2
# Transpose the matrix to get the result wanted in your case
A = numpy.array((a, b, U5)).T

with open(file="res.txt", mode="w") as b:
    b.write(numpy.array2string(A))

Uwagi na temat twojego kodu zapisane w pytaniu

  • W większości przypadków użycie emisji NumPy (usuwanie pętli nad tablicami) przyspiesza kod. Może być też łatwiejszy do odczytania.
  • Zapisywanie do pliku wewnątrz pętli jest złą praktyką. Nawet jeśli otworzysz plik za pomocą menedżera kontekstu with open, wydajność będzie niska.
  • Lepiej zbuduj swoją tablicę, przekonwertuj ją na ciąg.
  • Następnie zapisz całość do pliku.

Inne rozwiązanie wykorzystujące wbudowane funkcje numpy

Zastrzeżenie: używać tylko wtedy, gdy numer wiersza w Twojej tablicy jest mały (<500)

  • Zrzucanie tablicy numpy do pliku tekstowego jest funkcją wbudowaną w NumPy.

  • Spójrz na to: Dokumentacja API | numpy.savetxt

  • Jeśli jednak spojrzysz na kod źródłowy tej funkcji, zobaczysz, że iterujesz po wierszach tablicy, co ma duży wpływ na wydajność, gdy wzrasta liczba wymiarów (dzięki @hpaulj za uwagę).

  • W Twoim przypadku możesz zamienić dwa ostatnie wiersze powyższego fragmentu na:

numpy.savetxt("a.txt", A) # just see the doc to add some formatting options
0
Nibor Ndj 3 kwiecień 2020, 08:19

Podstawowym problemem jest to, że wielokrotnie otwierasz ten sam plik i nadpisujesz ten plik przy każdej iteracji w pętli for.

Zastosowanie:

with open("test.txt", 'w') as out:
    for n in range(ni):
        a = nc*(nb*nc*ia+nc*ib+ic)+U1[n]
        a2 = ia + U1[n]
        b2 = ib + U3[n]
        c2 = ic + U4[n]
        b = nc*(nb*nc*a2+nc*b2+c2)+U2[n]
        A = str(numpy.array((a,b,U5[n])))
        out.write(f"{A}\n")

Teraz plik text.txt będzie zawierał:

[1681 1774    2]
[1682 1848    1]
[1680 1685    1]
[1680 1682    1]
[1680 1680    0]
[1683 1933    3]
2
Shubham Sharma 2 kwiecień 2020, 12:25

W każdej iteracji zewnętrznej pętli prosisz system plików o nową, pustą kopię pliku „test.txt”. Więc oczywiście ostateczna wersja zawiera tylko zawartość ostatniej pętli.

Otwórz z atrybutami "a" dla „(zapisz-i-) dołącz” lub jak w innej odpowiedzi, i wydajniej, otwórz po wyjściu z pętli.

0
Lutz Lehmann 2 kwiecień 2020, 12:36