Запись массива numpy в текстовый файл - PullRequest
0 голосов
/ 02 апреля 2020

Я сделал следующий код:

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 дает мне следующее:

[1683 1933    3]

Но если я напечатаю тест .py с помощью print (A), я получаю это:

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

Как я могу записать весь отпечаток в test.txt? Я предполагаю сделать что-то вроде этого:

ol = []
ol.append(o))

Ответы [ 3 ]

2 голосов
/ 02 апреля 2020

Основная проблема c в том, что вы открываете один и тот же файл снова и снова и перезаписываете этот файл для каждой итерации в течение для l oop.

Использование:

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")

Теперь файл text.txt будет содержать:

[1681 1774    2]
[1682 1848    1]
[1680 1685    1]
[1680 1682    1]
[1680 1680    0]
[1683 1933    3]
0 голосов
/ 02 апреля 2020

Лучшее решение - Быстро и эффективно

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))

Замечания о вашем коде, написанном в вопросе

  • В большинстве случаев используется NumPy трансляция (удаление l * 1043) * через массивы) делает код быстрее. Это также может быть легче читать.
  • Запись в файл внутри al oop - плохая практика. Даже если вы оставите файл открытым с помощью диспетчера контекста with open, производительность будет низкой.
  • Лучше создать свой массив, преобразовать его в строку.
  • Затем записать все это в файл.

Другое решение с использованием numpy встроенных функций

Отказ от ответственности: Использовать, только если номер строки вашего массива мал (<500) </h3> Выгрузка массива numpy в текстовый файл является встроенной функцией в NumPy. Посмотрите на это: API do c | numpy .savetxt Однако, если вы посмотрите на исходный код этой функции, вы увидите, что вы перебираете строки массива, что сильно влияет на производительность при измерениях число увеличивается (спасибо @hpaulj за замечание). В вашем случае вы можете заменить две последние строки фрагмента выше на: numpy.savetxt("a.txt", A) # just see the doc to add some formatting options

0 голосов
/ 02 апреля 2020

На каждой итерации внешнего l oop вы запрашиваете у файловой системы свободную sh пустую копию «test.txt». Таким образом, конечно, окончательная версия содержит только содержимое последней l oop.

Открыть с атрибутами "a" для "(запись-и-) добавление" или как в другом ответе, и многое другое эффективно открыть один раз за пределами l oop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...