无法按名称访问列数据

时间:2014-01-13 13:04:36

标签: python arrays python-3.x numpy

我无法通过列名从结构化numpy数组中获取数据。最后是我的相关代码。我认为这很简单,很短,可以整体发布(这是一个sscce acutally)。

如果test.out文件不存在,则会在data['f3']文件中生成简单的数据。我总是从文件加载数据,仅用于测试目的。这里并不重要(我认为)。然后,如果文件中的数据是同质的,我强制使用结构化数组。我想通过像shape: (10, 1), data['f3']: [[ 0.50308252] [ 0.16259077] [ 0.5448315 ] [ 0.77284975] [ 0.01443514] [ 0.40232731] [ 0.6703865 ] [ 0.3918904 ] [ 0.07649033] [ 0.70849585]] 这样的列名来访问数据,但我得到了一些奇怪的形状。我得到一个单元素列表的列表。 E.g:

shape: (10, 1), data['f3']:
[ 0.50308252  0.16259077  0.5448315   0.77284975  0.01443514  0.40232731
  0.6703865   0.3918904   0.07649033  0.70849585]

所需的输出是:

data.shape

有趣的是,所有报告的形状都相同(对于dtype也是如此。

我是否以错误的方式执行reshape?我很确定可以做到因为this answer显示了具有所需结果的相同语义。我找到了一个col_name = ['f1', 'f3']的解决方法,但如果有必要的话似乎很奇怪。这也适用于列列表。您可以在我的代码中设置data[col_name]。有没有办法用简单的import numpy import os def get_data(): if not os.path.exists('test.out'): new_data = numpy.random.rand(10,10) numpy.savetxt('test.out', new_data, delimiter=',') data = numpy.genfromtxt('test.out',delimiter=",", dtype=None) return data def get_column(spreadsheet, column): data = spreadsheet[column] return data.reshape(data.shape[0]) data = get_data() #if data is homogenous, then forcibly transform into structured array if data.dtype.names is None: new_dtype = list(map(lambda z:('f%d'%(z),data.dtype),range(0,data.shape[1]))) #print('old dtype: {}, new dtype: {}'.format(data.dtype, new_dtype)) data.dtype = new_dtype col_name = 'f3' print(data.dtype) print("shape: {}, data:\n{}".format(data.shape, data)) print("shape: {}, data['{}']:\n{}".format(data[col_name].shape, col_name, data[col_name])) print("shape: {}, data['{}']:\n{}".format(data[col_name].shape, col_name, get_column(data, col_name))) 来完成它?

代码:

{{1}}

1 个答案:

答案 0 :(得分:2)

当您指定新的dtype以使data为结构化数组时,形状将从(10,10)更改为(10,1)。也就是说,它仍然是一个二维数组,第二个维度为长度1.如果结构化数组是由genfromtxt创建的,那么形状将是(10,)(即它将是一个 - 维数组)。您可以通过在分配dtype后分配新形状来完成相同的操作:

  data.shape = data.shape[0]

或用

替换data.dtype = new_dtype
  data = data.view(new_dtype).reshape(-1)

然后结构化数组具有形状(10,),data['f3']也具有形状(10,)。

请注意,从结构化数组中获取字段(例如data)是一个与data 形状相同的数组。也就是说,data['f3']始终具有与data相同的形状。它是结构化数组的'f3'字段的数组。我们经常将这些字段视为“列”(特别是当结构化数组为1-d时),但实际上它们只是结构中字段的名称。