Python3: преобразовать массив 2d [i, j] (1000x1000) в массив ijz (1000x1000,3) [i, j, z] - PullRequest
0 голосов
/ 07 мая 2020

У меня есть 2d-массив размером 1000x1000, который по сути является функцией f (i, j) = z

Если я напечатаю свой 2d_arry, результат будет:

array([[-0.07742694, -0.07745034, -0.07733458, ..., -2.85293312,
        -2.42345613, -1.77578657],
       [-0.08085247, -0.07929061, -0.07798724, ..., -2.73660511,
        -2.42752028, -1.96700638],
       [-0.08214564, -0.07995017, -0.07815817, ..., -2.64891561,
        -2.44130638, -2.13800253],
       ...,
       [-0.08825558, -0.08523855, -0.08262335, ..., -2.56719269,
        -2.61402861, -2.676069  ],
       [-0.08976864, -0.08709842, -0.08465978, ..., -2.50407402,
        -2.55825523, -2.62750258],
       [-0.09124844, -0.08912922, -0.08699924, ..., -2.42643301,
        -2.48579906, -2.55861256]])

I хотел бы иметь трехмерный массив, содержащий (i, j, z) компоненты. Мне нужно сохранить файл в формате x, y, z.

Это будет что-то вроде:

0 0 -0.07742694
0 1 -0.07745034
0 2 -0.07733458
... ... ...
Nx Ny -2.55861256

Я могу сделать это с вложенным l oop, но может займет некоторое время, если мой массив больше. Есть ли более простой / быстрый способ сделать это?

1 Ответ

1 голос
/ 07 мая 2020

Думаю, это сработает ...

import pandas as pd
import numpy as np

data = ([[-0.07742694, -0.07745034, -0.07733458, -2.85293312,
        -2.42345613, -1.77578657],
       [-0.08085247, -0.07929061, -0.07798724,  -2.73660511,
        -2.42752028, -1.96700638],
       [-0.08214564, -0.07995017, -0.07815817, -2.64891561,
        -2.44130638, -2.13800253],
       [-0.08825558, -0.08523855, -0.08262335, -2.56719269,
        -2.61402861, -2.676069  ],
       [-0.08976864, -0.08709842, -0.08465978, -2.50407402,
        -2.55825523, -2.62750258],
       [-0.09124844, -0.08912922, -0.08699924,  -2.42643301,
        -2.48579906, -2.55861256]])

df = pd.DataFrame(data=data)

n_elements = df.shape[0] * df.shape[1]
values = list(df.values.reshape([n_elements,]))

repeated_index = list(df.index.repeat(len(df.columns)))
columns = list(df.columns) * len(df.index)

new_data = np.stack([repeated_index, columns, values])
df_final = pd.DataFrame(new_data.T, 
                        columns=['i', 'j', 'z'])

df_final = df_final.astype({'i': 'int32', 'j':'int32'})
df_final.to_csv('./output.csv', header=False, index=False)
...