【问题标题】:Merging numpy ndarray from CSVs从 CSV 合并 numpy ndarray
【发布时间】:2012-10-17 19:05:03
【问题描述】:

我有以下代码:

from numpy import genfromtxt
nysedatafile = os.getcwd() + '/nyse.txt';
nysedata = genfromtxt(nysedatafile, delimiter='\t', names=True, dtype=None);
nasdaqdatafile = os.getcwd() + '/nasdaq.txt';
nasdaqdata = genfromtxt(nasdaqdatafile, delimiter='\t', names=True, dtype=None);

现在我想合并来自 2 个 CSV 的数据,并尝试了各种功能:

例如:

import numpy as np;
alldata = np.array(np.concatenate((nysedata, nasdaqdata)));
print('NYSE stocks:' + str(nysedata.shape[0]));
print('NASDAQ stocks:' + str(nasdaqdata.shape[0]));
print('ALL stocks:' + str(alldata.shape[0]));

返回:

TypeError: invalid type promotion    

我也尝试过numpy.vstack 并尝试在其上调用一个数组。 我希望最后一次打印给出前两个 csv 文件的行总和。


编辑: 这个命令:

print('NYSE shape:' + str(nysedata.shape));
print('NASDAQ shape:' + str(nasdaqdata.shape));
print('NYSE dtype:' + str(nysedata.dtype));
print('NASDAQ dtype:' + str(nasdaqdata.dtype));

返回:

NYSE shape:(3257,)
NASDAQ shape:(2719,)
NYSE dtype:[('Symbol', 'S14'), ('Name', 'S62'), ('LastSale', 'S9'), ('MarketCap', '<f8'), ('ADR_TSO', 'S3'), ('IPOyear', 'S4'), ('Sector', 'S21'), ('industry', 'S62'), ('Summary_Quote', 'S38')]
NASDAQ dtype:[('Symbol', 'S14'), ('Name', 'S62'), ('LastSale', 'S7'), ('MarketCap', '<f8'), ('ADR_TSO', 'S3'), ('IPOyear', 'S4'), ('Sector', 'S21'), ('industry', 'S62'), ('Summary_Quote', 'S34')]

【问题讨论】:

  • 贴出两个数组的shapedtype
  • @unutbu : 完成,Ubuntu anagram 先生 :)

标签: python csv numpy genfromtxt


【解决方案1】:

np.vstack(或np.concatenate)之所以报错,是因为两个数组的dtypes不匹配。

注意最后一个字段:('Summary_Quote', 'S38')('Summary_Quote', 'S34')。 nysedata 的 Summary_Quote 列长 38 个字节,而 nasdaqdata 的列只有 34 个字节长。 (编辑:LastSale 列也存在类似问题。)

这是因为genfromtxt 在设置dtype = None 参数时猜测列的dtype。对于字符串列,genfromtxt 确定需要包含的最小字节数 该列中的所有字符串。

所以要堆叠两个数组,必须将较小的数组提升为较大的数组:

import numpy.lib.recfunctions as recfunctions
recfunctions.stack_arrays([nysedata,nasdaqdata.astype(nysedata.dtype)], usemask = False)

(我之前的回答使用了 np.vstack。这会产生一个形状为 (N,1) 的二维数组。recfunctions.stack_arrays 返回一个形状为 (N,) 的一维数组。因为nysedata 和 @ 987654334@是一维的,我觉得还是返回一维数组比较好。)

可能更简单的解决方案是先连接两个 csv 文件,然后调用 genfromtxt:

import numpy as np
import os

cwd = os.getcwd()    
nysedatafile = os.path.join(cwd, 'nyse.txt')
nasdaqdatafile = os.path.join(cwd, 'nasdaq.txt')
alldatafile = os.path.join(cwd, 'all.txt')
with open(nysedatafile) as f1, open(nasdaqdatafile) as f2, open(alldatafile, 'w') as g:
    for line in f1:
        g.write(line)
    next(f2)
    for line in f2:
        g.write(line)

alldata = np.genfromtxt(alldatafile, delimiter='\t', names=True, dtype=None)

【讨论】:

  • 谢谢,我验证了我的文件如下: nysedata = genfromtxt(nysedatafile, delimiter='\t', names=True, dtype=[('Symbol', 'S14'), (' Name', 'S62'), ('LastSale', 'S9'), ('MarketCap', '
  • 另一方面(我是 Python 新手),逐行读取文件的标准方法是什么? (为了连接它们,我需要跳过除第一个文件之外的所有标题)
  • @BlueTrin:我编辑了这篇文章,展示了一种在跳过第二个文件的第一行时连接文件的方法。
  • 谢谢,这是我的第一个 Python 程序 :) 在您的回复和评论中我学到了很多东西。
猜你喜欢
  • 2018-12-24
  • 2018-10-10
  • 1970-01-01
  • 2022-01-01
  • 2016-02-10
  • 2018-07-15
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
相关资源
最近更新 更多