如何用numpy写csv文件?

How to write csv file with numpy?

我有两个要存储在 csv 文件中的 numpy 数组(A、B)和 2 个标量值(C、D)。 我知道如何在其中编写单个 numpy 数组:

A = np.array(...)
np.savetxt('path/to/file/filename.csv', A, delimiter = ",")

我希望我的 csv 文件的前两列包含 2 个数组 A 和 B,然后将 2 个标量值 C 和 D 作为第 3 列和第 4 列的第一个条目。

您需要先转换数组,也许使用 zip_longest:

import csv
from itertools import zip_longest
import numpy as np

A = np.array(...)  # 1d arrays
B = np.array(...)
C = 1.0  # scalars
D = 2.0
with open('filename.csv', 'w', newline='') as f:
    w = csv.writer(f)
    for row in zip_longest(A, B, [C], [D], fillvalue=''):
        w.writerow(row)

如果 A 和 B 很长,每行末尾会有很多空白单元格,可以将其修剪掉。

我假设所有 A 和 B 的长度都相同。我会用 pandas 按照我想要的方式组织它然后做 pandas.DataFrame.to_csv() 我会这样做:

import pandas as pd
import numpy as np

A = B = np.arange(5)  # 1d arrays
C = 1.0  # scalars
D = 2.0

df = pd.DataFrame({'A': A, 'B': B, 'C': np.NaN, 'D': np.NaN})
df.loc[0, 'C'] = C     # change 0 to 1 to fill the next row 
df.loc[0, 'D'] = D     # change 0 to 1 to fill the next row
df.to_csv('path/to/file/filename.csv')

我认为您必须使用迭代或其他库,例如Pandas 来做到这一点,因为每一列都有不同的大小(在这个例子中我们将处理不等大小的 A和 B)。所以保存的数组必须指定为object类型如果你想通过np.savetxt来做这个。如果您使用 object 类型的数组由 np.savetxt 保存,它将只填充 csv 文件的第一行:

A = np.array([2, 4.1, 5], dtype=np.float64)
B = np.array([2, 7, 9, 1], dtype=np.float64)
C = 1
D = 7

Output = np.zeros((1, 4), dtype=object)
Output[0, :] = A, B, C, D

np.savetxt('Output.csv', Output, delimiter=",", fmt='%s')

这将是:

我不认为仅通过 NumPy 就可以很好地处理它,并且通过 Pandas 或...等其他库尝试会更好,或者使用迭代打开 csv 文件并导入其中。但是如果你想使用 NumPy 来这样做(只是为了弄清楚如何通过 NumPy 来完成这项工作),它可以通过填充以间接方式均衡数组的大小来实现。为此,我们必须找到 AB 的最大长度以将数组填充到该长度。我在这个例子中用 np.nan 填充了填充索引,然后 :

max_len = max(A.shape[0], B.shape[0])

A_pad = np.pad(A, (0, max_len - A.shape[0]), constant_values=(np.nan,))
B_pad = np.pad(B, (0, max_len - B.shape[0]), constant_values=(np.nan,))
C_pad = np.pad(np.array([C], dtype=np.float64), (0, max_len - 1), constant_values=(np.nan,))
D_pad = np.pad(np.array([D], dtype=np.float64), (0, max_len - 1), constant_values=(np.nan,))

Output = np.array([A_pad, B_pad, C_pad, D_pad]).T
Output = Output.astype(str)
Output[Output == 'nan'] = ''

np.savetxt('Output.csv', Output, delimiter=",", fmt="%s")

由于 csv 文件是逗号分隔值,因此列术语对于 excel 文件更有用。如果我没理解错的话,你希望你的数据形状像这样

A1 B1 C D 
A2 B2  
A3 B3
.  .
.  .
.  .

将数组更改为 pandas 数据框并保存您喜欢的任何内容(excel 或 csv)非常有用。如果我们回到你的问题,解决方案可能是这样的:

A = np.array([1,2,3,4,5])
B = np.array([5,4,3,2,1])
C = [5]
D = [6]


_array = [A,B,C,D] #all values into list

data = pd.DataFrame(_array).T  # in order to get what you want, you have to transpose dataframe

data.to_csv('/Users/../data.csv',index=False,header=False)  # save as csv file

data.to_excel('/Users/../data.xlsx',index=False,header=False) # save as excel file to get column based